【问题标题】:ANTLR: Why the invalid input could match the grammar definitionANTLR:为什么无效输入可以匹配语法定义
【发布时间】:2019-04-29 09:43:00
【问题描述】:

我为计算表达式写了一个非常简单的语法定义:

grammar SimpleCalc;

options {
    output=AST;
}

tokens {
    PLUS  = '+' ;
    MINUS = '-' ;
    MULT = '*' ;
    DIV = '/' ;
}

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

ID  : ('a'..'z' | 'A' .. 'Z' | '0' .. '9')+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { Skip(); } ;

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/

start: expr EOF;

expr : multExpr ((PLUS | MINUS)^ multExpr)*;

multExpr : atom ((MULT | DIV)^ atom )*;

atom : ID
     | '(' expr ')' -> expr;

我尝试了start 的无效表达式ABC &* DEF,但它通过了。看起来 & 字符被忽略了。这里有什么问题?

【问题讨论】:

  • 你是如何检查这个语法的?你试过在 AntlrWorks 中用这个语法解析表达式吗?
  • 我尝试了生成的代码,它得到了ABC * DEF for ABC &* DEF的结果。
  • 嗯...请提供代码,用于调用 start 规则和确定输出 AST 结构。

标签: antlr antlr3


【解决方案1】:

其实你的无效表达式ABC &= DEF还没有通过;它导致NoViableAltException

【讨论】:

  • 对不起,我在问题中犯了一个错误。无效表达式为ABC &* DEF。它是 * 而不是 =
  • @JeffreyZhao 查看有关 ANTLR 错误处理的一些问题和答案,例如 this one that I answered 关于“消失”的语法错误。我的猜测是 ANTLR 正在检测错误,写信给System.err,并删除错误的输入,但您/用户都没有收到任何详细信息。
  • @JeffreyZhao,这没关系,我上面提到的结果与“ABC &* DEF”相同。您的语法无法解析带有“&”符号的表达式。你试过在 ANTLRWorks 中测试这个语法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2012-03-12
  • 2012-03-13
  • 1970-01-01
相关资源
最近更新 更多