【问题标题】:grammar is accepting too much语法接受太多
【发布时间】:2020-09-22 09:20:51
【问题描述】:

我是ANTLR 的新手,并尝试与一些非常简单的示例相处(使用antlr-4.8)。在我看来,这似乎是一个愚蠢的新手问题,但我找不到合适的答案(实际上,除了这个糟糕的标题,我什至不知道如何表达这个问题)。对不起!

我的语法是这样的。

grammar ExprTest;

expr    :   compareExpr
        |   NUMBER
        ;

compareExpr
        :   (GT | GE | LT | LE) NUMBER
        ;

NUMBER  :   [0-9]+;
GT      :   '>';
GE      :   '>=';
LT      :   '<';
LE      :   '<=';

它几乎可以完成这项工作并识别17&gt;15&lt;=22,并且在输入@34 时正确地向token recognition error 抱怨。

我不明白的是输入34&gt;。没有抱怨,匹配为(expr 34)

为什么最后一个大于号字符没有识别错误(显然位置错误)?

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    输入 34&gt; 不会产生令牌识别错误,因为其中有两个预期的令牌:NUMBERGT。而且解析器也没有问题,因为规则:

    expr    :   compareExpr
            |   NUMBER
            ;
    

    欣然接受NUMBER 令牌,然后停止,留下GT 令牌。

    如果您想强制解析器使用您的流中的所有令牌,您应该使用内置的EOF 令牌您的解析器:

    expr : (compareExpr | NUMBER) EOF;
    

    之后输入34&gt;产生错误。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多