如何使用解析树解决表达式?

时间:2012-08-13 20:38:28

标签: algorithm parsing antlr grammar context-free-grammar

您好我已经学习了一些基本的解析教程,我已经能够理解CFG和解析树的基础知识。

对基本方程采用以下语法:

term
  : INTEGER
  | '(' expression ')'
  ;

mult
  : term ('*' term)*
  ;

add
  : mult ('+' mult)*
  ;

expression
  : add
  ;

我想知道的是,它如何帮助我们解决这个问题?所有教程都以制作解析树或编写解析器(如预测解析器)结束,但所有解析器检查都是如果该表达式对语法有效但不对其进行评估。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:-1)

如果你只是想直接评估由一堆整数组成的数学表达式,那么解析形成一个AST可能有点过分。您可以使用标准评估算法(如Dijkstra's shunting-yard algorithm)来评估表达式并使用它完成。

但是,如果你计划用表达式做其他事情 - 比如,他们有变量,你试图绘制图表或采取衍生物 - 它非常有价值有一个解析树,因为它们自然地表示表达式的层次结构,并且很容易实现(递归地)表达式上的许多转换。例如,如果表达式是布尔公式,则可以使用解析树为公式构建真值表,方法是给出如何评估所有不同连接词的规则,然后在不同的真值上多次评估公式。如果您的公式在电子表格中使用,则将公式的解析树存储在单元格中可以提出诸如"此单元格所引用的单元格的问题。 (您可以递归地遍历树以收集依赖关系)或者"在给定当前电子表格内容的情况下评估单元格" (再次,使用递归步行)。