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