Antlr Eclipse IDE无法跳过空格

3

如果此问题已经被问过,我提前道歉,因为我找不到它。

我刚开始学习Antlr,使用Eclipse的antlr4IDE创建了一个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个回答

1
将语法更改为这样。
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


即使我完全复制了您所写的内容,仍然出现相同的错误。我在原始帖子中发布了解析树。 - Slavvio
没事了,它起作用了,谢谢!跟进问题:您是否知道为什么将符号大写会有所不同? - Slavvio
请查看语法词典。标记名称始终以大写字母开头。解析器规则名称始终以小写字母开头。 - user4910279

0
在查看了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中。

OP已经发布了他的语法问题,并且他在跳过空白字符。 - Alexander Rossa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接