我正在做一个数学表达式解析器,它将文本解析为抽象的语法树(我对此一无所知)。
我在Wikipedia上已经读到,可以使用Shunting-yard algorithm将标记的线性序列解析为Reverse Polish notation 或 为AST本身,但我找不到使用Shunting-yard直接解析 infix-to-AST 的任何示例。
现在我正在使用Shunting-yard将 infix 转换为 postfix 表示法,然后使用此类输出来构建AST。
将表达式转换为后缀表示法,然后根据其构建AST是一种好习惯吗?还是我有点笨拙?
答案 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)