【发布时间】: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 * DEFforABC &* DEF的结果。 -
嗯...请提供代码,用于调用 start 规则和确定输出 AST 结构。