1

我想使用 bison 和 flex 创建简单的 C++ 计算器。请注意,我是创建解析器的新手。我已经在 bison/flex 中找到了一些示例,但它们都是用 C 编写的。

我的目标是创建 C++ 代码,其中类将包含值、操作、函数的节点 - 以创建 AST(评估将在创建整个 AST 之后完成 - 从根开始并继续前进)。

例如:

my_var = sqrt(9 ** 2 - 32) + 4 - 20 / 5
my_var * 3

将被解析为:

        =
      /   \
my_var     +
         /   \
     sqrt     -
       |     / \
       -    4   /
      / \      / \
    **   32   20  5
   /  \
  9    2

第二个 AST 看起来像:

       *
      / \
my_var   3

然后下面的伪代码反映了 AST:

ast_root = create_node('=', new_variable("my_var"), exp)

其中exp是:

exp = create_node(OPERATOR, val1, val2)

但不是这样:

$$ = $1 OPERATOR $3

因为这样我直接获得了操作的价值,而不是创建节点。

我相信节点应该包含类型(操作),val1(节点),val2(节点)。在某些情况下,val2 会是 NULL,就像上面提到的sqrt一样,它最后接受一个参数。对?

如果您能针对上述问题(包括 *.y 文件创建 AST)向我提出 C++ 框架(无需评估)以帮助我理解在 AST 中创建/保存节点的方式,那就太好了。代码可以被剪断,只是为了让我明白。

如果您知道现有的(可能很简单)示例,我也将不胜感激。

感谢大家的时间和帮助!

4

1 回答 1

1

http://www.progtools.org/compilers/tutorials/cxx_and_bison/cxx_and_bison.html是一个迷你教程,它应该创建你想要的东西。

于 2010-06-07T22:54:09.367 回答