expression - 如何识别 ANTLR 中的额外输入错误?
问题描述
这是ANTLR中简单算术表达式的语法。我想获得一个简单算术表达式的解析树。
grammar LabeledExpr; // rename to distinguish from Expr.g4
prog: stat+ ;
stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| NEWLINE # blank
;
expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;
MUL : '*' ; // assigns token name to '*' used above in grammar
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;
ID : [a-zA-Z]+ ; // match identifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement
signal)
WS : [ \t]+ -> skip ; // toss out whitespace
现在我输入(3+5)*4
,ANTLR 正确生成了表达式的解析树。但是,如果我 input (3+5)4
,这不是一个有效的输入,我也不会得到任何错误和解析树。从输出来看,似乎只有(3+5)
被接受。
我还注意到一些类似的情况,如果在输入中找到了一些匹配项,那么剩余的输入将被忽略。例如,我定义了一个语法:
relation_op : LESS_THAN | LEQ | GREATER_THAN | GEQ | EQUAL |
DOUBLE_EQUAL | NEQ;
//Capital letters are predefined symbols(<,>,=...)
然后我输入<dskjkdsd
,解析树<
将正确显示,dskjkdsd
忽略额外的错误输入。
那么这出了什么问题呢?
解决方案
默认情况下,规则会尽可能多地匹配输入,然后将其余部分留在令牌流中。因此,当您将输入(3+5)4
提供给prog
规则时,您会注意到4
之后令牌仍将位于令牌流中。所以理论上你可以调用另一个规则然后使用它。
当您不想要这种行为时(您通常不希望从主代码调用的规则),您可以添加EOF
到规则的末尾以表示它必须始终匹配到文件末尾并生成如果不能,则错误。
因此,当您将prog
规则更改为:
prog: stat+ EOF ;
推荐阅读
- python - Python - 数据框货币转换
- html - 如何从 iframe 读取响应
- complex-event-processing - 关于 esper CEP 的 match_recognize 语法的问题
- google-bigquery - Google Big Query 不仅仅显示项目特定的数据集
- c# - 无法使用 LINQ 连接从右侧列表中选择值
- python-3.x - 如何以所有可能的方式将列表划分为大小为 k 的子字符串
- robotframework - 使用ride.py 命令打开 RIDE(机器人框架 IDE)时出错
- react-native - 有什么方法可以在 React Native for iOS 中实现真正的暗模式?
- visual-studio - 特定于配置的 resw 资源字符串变体
- asp.net - 更新表单下拉列表的角度设置值