ANTLR не соответствует вводу 'foo (some_foo)' ожидая {'foo'} - PullRequest
1 голос
/ 08 апреля 2019

Я пишу парсер с использованием 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

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, я получаю сообщение об ошибке. Любая помощь приветствуется!

Edit:

Моя иерархия разбора выглядит следующим образом:

Foo = mpsga (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 Ответ

1 голос
/ 08 апреля 2019

Это аргумент: ваша грамматика принимает в качестве констант 'foo' или 'foo2', а не some_foo.

...