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