Parsing 将中缀转换为后缀,然后在数学计算器上构建AST,这是否是一种习俗?

Parsing 将中缀转换为后缀,然后在数学计算器上构建AST,这是否是一种习俗?,parsing,math,evaluation,Parsing,Math,Evaluation,我正在做一个数学表达式解析器,它将文本解析成一个抽象语法树(对此我不太了解) 我在Wikipedia上读到过,可以使用将线性标记序列解析为或本身的AST,但我找不到任何使用分流码的直接中缀到AST解析的示例 现在我正在使用分流码将中缀符号转换为后缀符号,然后使用这样的输出来构建AST 将表达式转换为后缀符号,然后从中构建AST是一种好的做法,还是我有点笨拙?要使调车场直接生成AST,输出应更改为一堆节点 当输入中遇到数字、变量或其他终端时,会将其转换为叶节点,并推送到输出堆栈。当遇到一个操作符时

我正在做一个数学表达式解析器,它将文本解析成一个抽象语法树(对此我不太了解)

我在Wikipedia上读到过,可以使用将线性标记序列解析为本身的AST,但我找不到任何使用分流码的直接中缀到AST解析的示例

现在我正在使用分流码将中缀符号转换为后缀符号,然后使用这样的输出来构建AST


将表达式转换为后缀符号,然后从中构建AST是一种好的做法,还是我有点笨拙?

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

当输入中遇到数字、变量或其他终端时,会将其转换为叶节点,并推送到输出堆栈。当遇到一个操作符时,它会像往常一样被推到操作符堆栈上

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

在psudo代码中

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)
堆栈输出
堆栈运算符
函数运算符
操作符op=operators.pop()
Node right=output.pop()
Node left=output.pop()
Node n=makeNode(操作、左、右)
输出推送(n)

听起来不对,对我来说,你应该可以一下子创建ast。你写下一些例子了吗?从概念上讲,将表达式解析为ast很简单,您只需找到一个运算符(比如二进制),它就成为两个表达式的父表达式。在这种情况下,我如何处理括号?对于括号,ast中没有特定的运算符,而是树的结构决定求值顺序,这总是发生在深度优先。代码基本不变。当输入中遇到左括号时,将其推到运算符堆栈上。当遇到右括号时,使用上述方法不断弹出操作符,直到遇到匹配的左括号。只需弹出这个,但对输出树不做任何操作。