不会跳过Antlr Eclipse IDE White Space

时间:2017-03-20 03:05:28

标签: java regex eclipse antlr4

如果已经提出这个问题我提前道歉,似乎无法找到它。

我刚刚开始使用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的新手,所以我可能犯了一个愚蠢的错误。提前谢谢。

编辑:这是我的解析树和错误日志:

Parse Tree

错误日志:

Error Log

2 个答案:

答案 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]+ ; 

enter image description here

答案 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