首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >antlr4无法将文字提取到令牌中

antlr4无法将文字提取到令牌中
EN

Stack Overflow用户
提问于 2017-10-02 14:33:14
回答 1查看 160关注 0票数 1

我有以下的语法,并试图开始缓慢,工作,以移动复杂的论点。

代码语言:javascript
复制
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 : [ \t\r]+ -> skip ; // spaces, tabs, newlines
DASH : '-';
LOWER: [a-z];//'a' .. 'z';

我希望(目前)解析像这样的文件:

代码语言:javascript
复制
cmd1
cmd3 -a

如果我通过grun运行这个输入,就会得到一个错误:

代码语言:javascript
复制
$ java org.antlr.v4.gui.TestRig Command commands -tree
...
`line 3:6 mismatched input 'a' expecting LOWER`

它似乎更低应该匹配'a‘。如果我将arg定义更改为注释行,它可以很好地工作,并将'-a‘作为一个arg。显式使用“a”和使用“低”有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-02 16:37:15

一旦出现“不匹配”错误,将-tokens添加到grun中以显示令牌,它将有助于查找您认为lexer将做什么和实际做了什么之间的差异。用你的语法:

代码语言:javascript
复制
$ 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

您立即看到字母a是一个NAME,而不是预期的LOWER

另外,用一个空的选项来观察规则:

代码语言:javascript
复制
args
    :   arg
    |
    ;

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

代码语言:javascript
复制
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    : [ \t\r]+ -> skip ;

处决:

代码语言:javascript
复制
$ 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46527648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档