【问题标题】: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))

解析如下:

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多