我想用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中创建/保存节点的方式,那将是很好的。代码可以被剪断,只是为了让我明白这个想法。
如果您知道任何现有(可能很简单)的例子,我也将不胜感激。
感谢大家的时间和帮助!
答案 0 :(得分:1)