代码之家  ›  专栏  ›  技术社区  ›  JCN

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

  •  -2
  • JCN  · 技术社区  · 6 年前

    我想知道生成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代码?

    我在这个领域并不完全是新手,我已经访问了很多网站。我只想知道对于玩具语言来说,哪种解决方案(或另一种)是最简单、最有效的实现方案;因为我想“真正的”语言应该是“AST赢了”。

    1 回复  |  直到 6 年前
        1
  •  0
  •   sivizius    6 年前

    您可以使用定制的调车场算法,这将产生如下中间结果:

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