java - 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
部分来说是模棱两可的。
解决方案
这是论点:您的语法接受“foo”或“foo2”作为常量,而不是 some_foo。
推荐阅读
- php - 在多维 Stdclass PHP 中搜索
- nginx - DigitalOcean - 除了一页之外,如何将 website.net 流量路由到 website.com?
- ios - React Native TextInput 背景颜色设置为透明颜色时看起来是双层的
- r - 如何在 observeEvent 函数中调用模块(闪亮)
- haskell - 如何实现一个功能来在磁盘上保存带有关联名称的 Monad?
- database - 字符串如何在数据库中存储为字节?
- ruby-on-rails - 如何创建表单来触发模型方法
- python - Python错误不让程序运行,因为它说未定义局部变量
- php - 选择语句回显行两次
- math - Sympy Line3D 与立方体的交点