c - 解析器树或表达式树

标签 c parsing expression-trees

我正在做一个命令行计算器,所以我需要解析表达式。

calc 2*(3+4)*5

我已经完成了扫描步骤,返回了一个 token 数组。 现在我在解析器步骤。但是我不知道如何做解析器/表达式树。

这就是我目前所拥有的一切:

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);
}

然后我像这样传递 token 数组:

while (*tokens != 0) {
    NODE* n = create_node(*tokens++);
    insert_node(&root, &n);
}

如您所见,我的树只是向左升起。我不知道如何让它按顶部的运算符和数字作为叶子进行排序,包括运算符优先顺序。

我希望能从编程(代码)方面得到启发。

最佳答案

我觉得你创建节点的代码没问题。问题是您需要代码来弄清楚如何正确构建二叉树。您不能只在发现 NULL 指针的任何地方粘贴一个节点。

您的示例表达式:2*(3+4)*5

会变成这样的:

    *
   / \
  *   5
 / \
2   +
   / \
  3   4

你的老师应该已经给了你一些关于如何做到这一点的想法。

当我在大学的时候,我写了这样的代码,我们写了我们自己的“递归下降解析器”。另一种流行的方法是使用像 GNU Bison 这样的系统。

你应该复习一下你的笔记,看看老师是怎么说的,如果你真的不知道就问老师。

http://en.wikipedia.org/wiki/Recursive_descent_parser

http://en.wikipedia.org/wiki/GNU_bison

关于c - 解析器树或表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024682/

相关文章:

c++ - 在没有附加库的情况下在标准 C/C++ 中解析 XML

ruby - 哈希表中的多个匹配项

sql-server - LINQ To SQL可以生成无效的SQL吗?

c# - 如何使用 Expression 构建匿名类型?

c# - "IntConverter"的实例存储在哪里?

c - 如何获取C函数指针的函数名

c - stdout 和 STDOUT_FILENO 的区别

c - 结构函数指针参数?

jquery - 将来自 json 响应的 JSON 值放入 HTML 元素

C/C++ Posix BSD 套接字 - HTTP 请求始终返回状态 400