从infix转换为postfix,然后在数学评估器上构建AST,是否是明智的做法?

时间:2018-12-18 18:54:52

标签: parsing math evaluation

我正在做一个数学表达式解析器,它将文本解析为抽象的语法树(我对此一无所知)。

我在Wikipedia上已经读到,可以使用Shunting-yard algorithm将标记的线性序列解析为Reverse Polish notation 为AST本身,但我找不到使用Shunting-yard直接解析 infix-to-AST 的任何示例。

现在我正在使用Shunting-yard将 infix 转换为 postfix 表示法,然后使用此类输出来构建AST。

将表达式转换为后缀表示法,然后根据其构建AST是一种好习惯吗?还是我有点笨拙?

1 个答案:

答案 0 :(得分:2)

要使调车场直接产生AST,应将输出更改为一堆节点。

在输入中遇到数字,变量或其他终端时,该变量将转换为叶节点,并被压入输出堆栈。遇到操作员时,它会像往常一样推入操作员堆栈。

最大的变化是当操作员从操作员堆栈中弹出时会发生什么。如果它是二进制运算符,则弹出输出堆栈上的最后两个节点,将使用这些节点作为子代构造一个新的二进制节点,并将其推回输出堆栈。

使用伪代码

Stack<Node> output
Stack<Operator> operators

function popOperator
    Operator op = operators.pop()
    Node right = output.pop()
    Node left = output.pop()
    Node n = makeNode( op, left, right )
    output.push(n)