如果已经提出这个问题我提前道歉,似乎无法找到它。
我刚刚开始使用Antlr,使用antlr4IDE for Eclipse为一小部分Java创建解析器。出于某种原因,除非我在我的正则表达式中明确说明存在空格,否则解析器将抛出错误。
我的语法:
grammar Hello;
r :
(Statement ';')+
;
Statement:
DECL | INIT
;
DECL:
'int' ID
;
INIT:
DECL '=' NUMEXPR
;
NUMEXPR :
Number OP Number | Number
;
OP :
'+'
| '-'
| '/'
| '*'
;
WS :
[ \t\r\n\u000C]+ -> skip
;
Number:
[0-9]+
;
ID :
[a-zA-Z]+
;
尝试解析时
int hello = 76;
我收到错误:
Hello::r:1:0: mismatched input 'int' expecting Statement
Hello::r:1:10: token recognition error at: '='
但是,当我手动将令牌WS添加到规则中时,我没有收到任何错误。
我出错的任何想法?我是Antlr的新手,所以我可能犯了一个愚蠢的错误。提前谢谢。
编辑:这是我的解析树和错误日志:
错误日志:
答案 0 :(得分:2)
更改这样的语法。
grammar Hello;
r : (statement ';')+ ;
statement : decl | init ;
decl : 'int' ID ;
init : decl '=' numexpr ;
numexpr : Number op Number | Number ;
op : '+' | '-' | '/' | '*' ;
WS : [ \t\r\n\u000C]+ -> skip ;
Number : [0-9]+ ;
ID : [a-zA-Z]+ ;
答案 1 :(得分:0)
在查看the documentation on antlr4之后,您似乎必须为您希望在文件中看到的所有字符组合制定一个规范,从开始到结束 - 不仅仅是您想要处理的那些。
在这方面,它预计您必须明确说明空白,例如:
WS : [ \t\r\n]+ -> skip;
这就是skip命令存在的原因:
A 'skip' command tells the lexer to get another token and throw out the current text.
虽然注意到有时会导致一些麻烦,例如this post。