ANTLR:为什么无效输入可以匹配语法定义

ANTLR:为什么无效输入可以匹配语法定义,antlr,antlr3,Antlr,Antlr3,我已经为计算表达式编写了一个非常简单的语法定义: grammar SimpleCalc; options { output=AST; } tokens { PLUS = '+' ; MINUS = '-' ; MULT = '*' ; DIV = '/' ; } /*------------------------------------------------------------------ * LEXER RULES *--------

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

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
,但它通过了。看起来
&
字符被忽略了。这里有什么问题吗?

实际上,您的无效表达式
ABC&=DEF
尚未传递;它会导致
NoviableException


实际上,您的无效表达式
ABC&=DEF
尚未通过;它会导致
NoviableException


您是如何检查此语法的?您是否尝试过在AntlWorks中使用此语法解析表达式?我尝试了生成的代码,它得到了
ABC&*DEF
for
ABC&*DEF
的结果。。。请提供用于调用开始规则和确定输出AST结构的代码。您是如何检查此语法的?您是否尝试过在AntlWorks中使用此语法解析表达式?我尝试了生成的代码,它得到了
ABC&*DEF
for
ABC&*DEF
的结果。。。请提供用于调用开始规则和确定输出AST结构的代码。抱歉,我在问题中犯了一个错误。无效表达式为
ABC&*DEF
。它是
*
而不是
=
@JeffreyZhao查看一些关于ANTLR错误处理的问题和答案,例如关于“消失”语法错误。我猜ANTLR正在检测错误,写入
System.err
,并删除错误输入,但您/用户没有收到任何详细信息。@JeffreyZhao,这没关系,与我上面提到的“ABC&*DEF”结果相同。语法无法分析带有“&”符号的表达式。你试过在AntlWorks中测试这个语法吗?对不起,我在这个问题上犯了一个错误。无效表达式为
ABC&*DEF
。它是
*
而不是
=
@JeffreyZhao查看一些关于ANTLR错误处理的问题和答案,例如关于“消失”语法错误。我猜ANTLR正在检测错误,写入
System.err
,并删除错误输入,但您/用户没有收到任何详细信息。@JeffreyZhao,这没关系,与我上面提到的“ABC&*DEF”结果相同。语法无法分析带有“&”符号的表达式。你试过在AntlWorks中测试这个语法吗?