【问题标题】:Parsing expressions with subexpressions in ANTLR用 ANTLR 中的子表达式解析表达式
【发布时间】:2011-04-07 03:01:09
【问题描述】:
我正在尝试解析 ANTLR 中的递归表达式,例如:
(a + (b + C))
或
((a + b))
我阅读了这个假设的解决方案:
ANTLR Grammar for expressions
但是,当我尝试创建如下规则时:
ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';
ANTLR 抱怨“规则括号表达式是左递归的”。
我如何解析可以在其内部具有相同形式的子表达式的表达式?
【问题讨论】:
-
不要仔细查看您链接到的帖子:它充斥着虚假信息,而且 OP 发布的语法甚至都不是有效的 ANTLR 语法。我很惊讶你设法挖掘出那个旧的(不正确的!)问答,而最近发布的还有很多其他的(比如:this one,或面向 C# 的this one)。
-
标签:
antlr
antlr3
antlrworks
【解决方案1】:
你可以这样做:
parse
: addExp EOF
;
addExp
: multExp (('+' | '-') multExp)*
;
multExp
: atom (('*' | '/') atom)*
;
atom
: ID
| '(' addExp ')'
;
ID : 'a'..'z' | 'A'..'Z';
越接近atom 规则,优先级越高:所以+ 和- 的优先级最低,其次是* 和/,最后是ID 和@ 987654330@ 的优先级最高。
它解析输入:
((a / b)) - x
如下:
和输入:
(a * (b + C))
解析如下: