我正在做一个命令行计算器,所以我需要解析表达式。
calc 2*(3+4)*5
我已完成扫描仪步骤,返回令牌的数组。 现在我正处于解析器步骤。但是我不知道如何做一个解析器/表达式树。
到目前为止,这就是我的全部内容:
NODE* create_node(TOKEN* t) {
NODE* n = (NODE*)malloc(sizeof(NODE));
n->t = t;
n->l = n->r = 0;
return n;
}
void insert_node(NODE** top, NODE** n) {
if (!*top) {
*top = *n;
return;
}
if (!(*top)->l) insert_node(&(*top)->l, n);
else
if (!(*top)->r) insert_node(&(*top)->r, n);
else
insert_node(&(*top)->l, n);
}
然后我传递令牌数组,如:
while (*tokens != 0) {
NODE* n = create_node(*tokens++);
insert_node(&root, &n);
}
你可以看到我的树只向左抬起。我不知道如何通过顶部的运算符和数字作为包括运算符优先顺序的叶子进行排序。
我很感激启蒙,也喜欢编程(代码)术语。
答案 0 :(得分:8)
您创建节点的代码对我来说没问题。问题是你需要代码来弄清楚如何正确构建二叉树。您不能只在任何找到NULL指针的地方粘贴节点。
您的示例表达式:2*(3+4)*5
会变成类似的东西:
*
/ \
* 5
/ \
2 +
/ \
3 4
你的老师应该已经知道如何做到这一点。
当我在大学时,我编写了这种代码,并编写了我们自己的“递归下降解析器”。另一种流行的方法是使用像GNU Bison这样的系统。
你应该检查你的笔记,看看老师对此有何看法,并询问老师你是否真的不知道。
答案 1 :(得分:2)
@Fabricio:提示。尝试将输入(中缀表达式)转换为后缀或前缀表达式。在转换它们时将令牌推入堆栈。弹出每个元组(一个运算符和两个操作数)评估并将结果推送到堆栈。重复直到堆栈为空。您可以在输入表达式中添加冗余大括号,以便轻松强制执行运算符优先级(但是以某些点为代价,或者您必须说服您的教授:))。
答案 2 :(得分:0)
请参阅
的C ++实现的这些链接如前所述,两种实现都使用堆栈。在中缀到二进制表达式树的情况下,使用两个堆栈,一个用于运算符,一个用于操作数。