生成AST是否必须创建编译器?

时间:2018-02-08 21:05:40

标签: c++ parsing assembly abstract-syntax-tree

我想知道是否必须通过编译器生成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;语言。

1 个答案:

答案 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,而是使用基于堆栈的中间代码。