首页 > 解决方案 > 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 层次结构如下所示:

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部分来说是模棱两可的。

标签: javaparsingantlrantrl4

解决方案


这是论点:您的语法接受“foo”或“foo2”作为常量,而不是 some_foo。


推荐阅读