我想知道是否必须通过编译器生成AST来实现一种语言。我曾多次询问过,每次都强烈建议在解析/删除代码时生成AST。 例如,这个:
int i = 2 + 3;
必须给出这个:
=
/ \
i +
/ \
2 3
但这种简单的条件不够吗? :
if (statement == variable_declaration){
if (NotDeclaredInCurrentBlock(NameOfVariable)){
// ...
}
else
Throw "Error: The '" << NameOfVariable << "' variable is already declared";
}
我真的不知道如何制作一个好的AST,我想知道什么是更简单的和/或更好的性能作为PARSING解决方案。 例如,ASM代码可以更容易生成?
我在这个领域并不是全新的,而且我已经访问过很多网站。我想知道哪种解决方案(或另一种解决方案)对于玩具语言来说是最简单和最有效的解决方案;因为我猜它是赢得的AST&#34;对于一个真实的&#34;语言。
答案 0 :(得分:0)
你可以使用一个定制的分流码算法,这将产生这样的中间体:
<i> create_int <i> 2 3 + :=
其中<i>
是某种标识符。您可以使用符号列表来实现此目的,您可以在其中查找现有符号的ID或添加新符号,并将当前计数器值作为id并递增此计数器。
您可以将此转换为x86代码,如下所示:
code:
push 0 ;id of <i>
push 2
push 3
pop eax
pop edx
add eax, edx ; +
push eax
pop eax
pop edx
mov dword [ data + 4 * edx ], eax ; :=
jmp finally
data:
vars rd 1 ;number of variables, maximum variable-size is dword
正如您可能看到的,这会产生错误的代码,需要进一步优化。但是,这段代码不使用ASt,而是使用基于堆栈的中间代码。