【发布时间】:2022-01-21 17:02:09
【问题描述】:
我一直在尝试实现the shunting yard algorithm,但是我的解析器的输出不正确。
let mut stack: Vec<String> = vec![];
let mut op_stack: Vec<String> = vec![];
for current in sub_tree {
if current.tok_type == TokenType::NUMBER || current.tok_type == TokenType::NEGNUMBER {
self.parse();
stack.push(current.content.clone());
}
if current.tok_type == TokenType::SUBBIN
|| current.tok_type == TokenType::PLUSBIN
|| current.tok_type == TokenType::DIVBIN
|| current.tok_type == TokenType::MULBIN
{
while op_stack.len() > 0 && op_stack.last().unwrap().to_string() != "(" {
if op_prec(&op_stack.last().unwrap().to_string()) > op_prec(¤t.content)
|| (op_prec(&op_stack.last().unwrap().to_string()) == op_prec(¤t.content)
&& op_asso(¤t.content) == "left")
{
stack.push(op_stack.pop().unwrap().to_string());
} else {
break;
}
}
op_stack.push(current.content.to_string())
}
}
我正在解析的原始方程:1 + 2 * 3
我希望得到以下输出:1 2 3 * +
相反,我得到了这个:1 2 3 + *
我认为我在 while 循环中的某个地方出错了,但我真的不知道。我尝试按照维基百科文章中的示例进行操作。
【问题讨论】:
-
预期输出应该是
123*+而不是12*3+?另外,我们需要知道op_stack的内容在最后一个令牌3被推送到stack之后是如何处理的。 -
@Joe_Jingyu 你说得对,预期的输出是
123*+。之后我对op stack所做的唯一事情是将op_stack的其余部分合并回stack。 -
要将op_stack的剩余部分合并回栈中,是否按照栈后进先出的方式合并,也就是说先合并
*,再合并+为这个案子? -
@Joe_Jingyu 我应该怎么做?我只是将整个 op_stack 连接到堆栈向量的末尾。
标签: parsing rust postfix-notation shunting-yard