【问题标题】:Antlr Eclipse IDE White Space not being skippedAntlr Eclipse IDE White Space 未被跳过
【发布时间】:2017-08-11 05:38:43
【问题描述】:

如果这个问题已经被问过,但似乎找不到,我提前道歉。

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

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

错误日志:

【问题讨论】:

    标签: java regex eclipse antlr4


    【解决方案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]+ ; 
    

    【讨论】:

    • 我仍然有同样的错误,即使在完全复制了你写的内容之后。我在原始帖子中发布了解析树
    • 没关系,它成功了,谢谢!后续问题:你知道为什么大写符号会有所不同吗?
    • Grammar Lexicon。令牌名称总是以大写字母开头。解析器规则名称始终以小写字母开头。
    【解决方案2】:

    查看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

    【讨论】:

    • OP 已经发布了他的语法,他正在跳过空格。
    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2015-09-11
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多