是强制创建编译器的AST的生成
Is the generation of an AST mandatory to create a compiler?
我想知道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,而是基于堆栈的中间代码。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何克服提升精神AST混乱
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 是强制创建编译器的AST的生成