2012-08-13 203 views
1

嗨,我一直在解析一些基本的教程,我已经能够理解CFG和解析树的基础知识。如何使用解析树来解析表达式?

采取以下语法基本公式:

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

mult 
    : term ('*' term)* 
    ; 

add 
    : mult ('+' mult)* 
    ; 

expression 
    : add 
    ; 

我想知道那是什么,它是如何帮助我们解决方程?所有的教程最后都是通过制作一个解析树或者像预测解析器一样编写一个解析器来完成的,但是所有的解析器校验是,如果该表达式符合语法,但是它不评估它。

任何人都可以帮助我吗?

+0

解析树不计算方程。 – 2012-08-13 20:41:38

+0

是的,我们如何用解析来解决方程式? – Dude 2012-08-13 20:42:20

+0

为什么一个-1?我认为这是一个有效的问题,仅仅因为我不知道这并不意味着我浪费了你的时间...... – Dude 2012-08-13 20:44:53

回答

-1

如果您只是试图直接评估由一堆整数组成的数学表达式,那么解析以形成AST可能是矫枉过正的。您可以使用像Dijkstra's shunting-yard algorithm这样的标准评估算法来评估表达式并对其进行处理。但是,如果您打算对表达式做其他事情 - 比如说,它们中有变量,并且您正在尝试绘制图形或采用衍生工具 - 因为它们具有分析树是非常有价值的,因为它们自然地表示表达式的层次结构,并且可以很容易地在表达式上实现(递归)很多转换。例如,如果您的表达式是布尔公式,则可以使用解析树为公式创建真值表,方法是给出如何评估所有不同连接词的规则,然后根据不同的真值对多次计算公式。如果在电子表格中使用公式,则将公式的分析树存储在单元格中可以提出问题,例如“这个单元格引用的单元格是什么”(您可以递归地遍历树来收集依赖关系),或者“根据当前电子表格内容评估单元格”(再次使用递归步骤)。