ANTLR4 无法将文本提取到令牌中



我有以下语法,并试图缓慢地开始,以移动复杂的参数。

grammar Command;
commands : command+ EOF; 
command : NAME args NL;
args : arg | ;
arg : DASH LOWER | LOWER;
//arg : DASH 'a' | 'x';
NAME : [_a-zA-Z0-9]+;
NL : 'n';
WS : [ tr]+ -> skip ; // spaces, tabs, newlines
DASH : '-';
LOWER: [a-z];//'a' .. 'z';

我希望(现在)能够这样解析文件:

cmd1
cmd3 -a

如果我通过Grun运行该输入,我会发现一个错误:

$ java org.antlr.v4.gui.TestRig Command commands -tree
...
`line 3:6 mismatched input 'a' expecting LOWER`

似乎较低应该匹配" a"。如果我将ARG定义更改为已评论的线路,则可以正常工作,并且我将" -a"视为ARG。显式使用" A"和使用" A"有什么区别?

一旦您遇到了"错配"错误,请将-tokens添加到Grun以显示令牌,它有助于找到您认为Lexer会做的事情和实际做的事情之间的差异。使用您的语法:

$ alias grun='java org.antlr.v4.gui.TestRig'
$ grun Command commands -tokens -diagnostics t.text
[@0,0:3='cmd1',<NAME>,1:0]
[@1,4:4='n',<'
'>,1:4]
[@2,5:8='cmd3',<NAME>,2:0]
[@3,10:10='-',<'-'>,2:5]
[@4,11:11='a',<NAME>,2:6]
[@5,12:12='n',<'
'>,2:7]
[@6,13:12='<EOF>',<EOF>,3:0]
line 2:6 mismatched input 'a' expecting LOWER

您立即看到字母aNAME,而不是预期的LOWER

还可以用空的替代方案观看规则:

args
    :   arg
    |
    ;

在某些情况下可能会导致问题。我更喜欢明确添加?后缀,这意味着零或一次。所以我的解决方案是:

grammar Command;
commands
@init {System.out.println("Question last update 1829");}
    :   command+ EOF
    ; 
command
    :   NAME args? NL
    ;
args
    :   arg
    ;
arg : DASH? LOWER ;
LOWER : [a-z] ;
NAME  : [_a-zA-Z0-9]+;
DASH  : '-' ;
NL    : 'n' ;
WS    : [ tr]+ -> skip ;

执行:

$ grun Command commands -tokens -diagnostics t.text
[@0,0:3='cmd1',<NAME>,1:0]
[@1,4:4='n',<'
'>,1:4]
[@2,5:8='cmd3',<NAME>,2:0]
[@3,10:10='-',<'-'>,2:5]
[@4,11:11='a',<LOWER>,2:6]
[@5,12:12='n',<'
'>,2:7]
[@6,13:12='<EOF>',<EOF>,3:0]
Question last update 1829

相关内容

  • 没有找到相关文章

最新更新