我正在用 C++ 实现一种编程语言,我正在进入 AST 生成阶段。
我想使用一个三步程序:
- 识别语句的类型;
- 将标记与左值右值和节点中的表达式分离为临时和本地 AST;
- 设计并将其添加到全局 AST。
例如,这将为声明变量提供以下内容:
var MyVar : integer = 8 + 2;
临时形式(右值/节点/左值):
left:
-left:
"MyVar"
-node:
":"
-right:
"integer"
node:
"="
right:
-left:
"8"
-node:
"+"
-right:
"2"
表示为经典的 AST:
"="
/ \
/ \
/ \
":" "+"
/ \ / \
/ \ "8" "2"
/ \
"MyVar" "integer"
然后,将临时树添加到全局树中,指定声明的类型:
[EXP]
|
VarDecl
|
{ ... }
这适用于除函数声明和函数调用之外的所有内容:
func add(a : integer, b : integer) : integer;
add(8, 2);
实际上,对于这种类型的表达式,没有节点可以区分左值和右值。我也不知道如何表示函数参数。我曾想过这样的事情:
left:
"add"
params:
[
-left:
"a"
-node:
":"
-right:
"integer"
]
[
-left:
"b"
-node:
":"
-right:
"integer"
]
node:
":"
right:
"integer"
同上通话:
left:
"add"
params:
[
"8"
]
[
"2"
]
但我觉得如果我这样做,就没有逻辑了。
所以,我想知道是否没有一种方法可以接近我的方法来改进它,或者我的方法是否必须完全修改。
PS:我在抽象语法分析和树领域还比较陌生,但是我已经阅读了很多关于这个主题的文档和教程。