是强制创建编译器的AST的生成

Is the generation of an AST mandatory to create a compiler?

本文关键字:AST 编译器 创建      更新时间:2023-10-16

我想知道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,我想知道什么是简单和/或更好地作为解析解决方案。例如,使用哪种解决方案的ASM代码更易于生成?

我在这个领域并不是全新的,我访问过很多网站。我想知道哪种解决方案(或其他解决方案(将是玩具语言实施的最简单,最有效的。因为我猜这是"真实"语言的"胜利"。

您可以使用自定义的分流码算法为此,这将产生像这样的中间体:

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