ANTLR不匹配的输入'foo(some_foo)'预期为{'foo'}

时间:2019-04-08 07:34:47

标签: java parsing antlr antrl4

我正在使用ANTLR编写解析器,现在处于测试解析器/词法分析器的阶段。 我在尝试基本解析变量分配时偶然发现了一个奇怪的错误。 (就像这样)

Foo = mpsga(LT);

我收到错误消息:mismatched input 'line 1:6 mismatched input 'mpsga(LT)' expecting 'mpsga'

当我删除方括号(或参数LT)时,这尤其奇怪, 解析器可以识别mpsga,并且只忽略括号(或参数)。


我的语法看起来像这样:

Lexer

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
;


当我尝试用Java解析此Foo = mpsga(LT);时,出现错误。 任何帮助表示赞赏!

编辑:

我的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>

免责声明:我解决了这个问题。对于遇到同样问题的任何人:我在mpsga部分有一些Lexer规则。

1 个答案:

答案 0 :(得分:1)

这是参数:您的语法接受'foo'或'foo2'作为常量,而不是some_foo。