用bison& amp;创建简单的计算器在C ++中弯曲(不是C)

时间:2010-06-07 22:35:35

标签: c++ bison abstract-syntax-tree flex-lexer

我想用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中创建/保存节点的方式,那将是很好的。代码可以被剪断,只是为了让我明白这个想法。

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

感谢大家的时间和帮助!

1 个答案:

答案 0 :(得分:1)

http://www.progtools.org/compilers/tutorials/cxx_and_bison/cxx_and_bison.html是一个小型教程,可以创建你想要的东西。

相关问题