ANTLR не соответствует вводу 'foo(some_foo)' ожидая {'foo'}
Я пишу парсер с использованием ANTLR и сейчас на стадии тестирования моего парсера / лексера. Я наткнулся на странную ошибку, пытаясь разобрать в основном присвоение переменной. (Как это)
Foo = mpsga(LT);
Я получаю ошибку: mismatched input 'line 1:6 mismatched input 'mpsga(LT)' expecting 'mpsga'
Это особенно странно, когда я удаляю скобки (или аргумент LT
), парсер распознает mpsga
и он только пропускает скобки (или аргумент).
Моя грамматика выглядит примерно так:
лексер
lexer grammar FooLexer;
COMMENT
:
'#' ~[\r\n]* -> channel ( HIDDEN )
;
NEWLINE
:
(
'\r'? '\n'
| '\r'
)+ -> channel ( HIDDEN )
;
EQUALSSIGN
:
'='
;
SEMICOLON
:
';'
;
MPSGA_255_1
:
'LT'
;
MPSGA
:
'mpsga'
;
WHITESPACE
:
(
' '
| '\t'
)+ -> channel ( HIDDEN )
;
BRACKET_OPEN
:
'('
;
BRACKET_CLOSED
:
')'
;
VAR
:
[a-zA-Z][0-9a-zA-Z_]*
;
синтаксический анализатор
parser grammar FooParser;
options {
tokenVocab = FooLexer;
}
stmt_block
:
stmt_list EOF
;
stmt
:
VAR EQUALSSIGN expr SEMICOLON NEWLINE?
;
stmt_list
:
stmt
| stmt_list stmt
;
expr
:
extvar
;
extvar
:
MPSGA BRACKET_OPEN mpsga_field BRACKET_CLOSED
;
mpsga_field
:
MPSGA_255_1
;
Когда я пытаюсь разобрать это Foo = mpsga(LT);
в Java я получаю ошибку. Любая помощь приветствуется!
Редактировать:
Моя Parse hierachy выглядит следующим образом:
Foo = мпсга (LT);
stmt_block
->stmt_list:1
-->stmt
--->"Foo"
--->"="
--->expr
---->extvar
----->"mpsga(LT)"
---->";"
-><EOF>
Foo = mpsga (LT;
stmt_block
->stmt_list:1
-->stmt
--->"Foo"
--->"="
--->expr
---->extvar
----->"mpsga"
----->"("
----->mpsga_field
------>"LT"
----->"<missing ')'>"
---->";"
-><EOF>
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я решил проблему. Для тех, кто испытывает ту же проблему: у меня были некоторые правила Lexer, которые были неоднозначными для mpsga
часть.
1 ответ
Это аргумент: ваша грамматика принимает в качестве констант 'foo' или 'foo2', а не some_foo.