Parsing 编译器.AST中类型声明的指令选择

Parsing 编译器.AST中类型声明的指令选择,parsing,compiler-construction,types,code-generation,semantic-analysis,Parsing,Compiler Construction,Types,Code Generation,Semantic Analysis,我正在学习编译器,并为一种处理两种类型的简单语言创建代码生成器:字符和整数 在用户输入被扫描器扫描并被解析器解析之后,我得到输入的AST表示。我已经为一种更简单的语言生成了代码,这种语言只处理带有整数、运算符和变量的表达式 然而,使用这种新语言,我有时会得到类型声明的子树,如下所示: (IS TYPE (x) (INT)) 也就是说x是INT型的 在我的代码生成器中是否应该有一个案例来处理这些类型声明?或者这只是为了让语义分析器进行类型检查,所以我应该假设类型已经检查过,忽略树的这一部分,并简

我正在学习编译器,并为一种处理两种类型的简单语言创建代码生成器:字符和整数

在用户输入被扫描器扫描并被解析器解析之后,我得到输入的AST表示。我已经为一种更简单的语言生成了代码,这种语言只处理带有整数、运算符和变量的表达式

然而,使用这种新语言,我有时会得到类型声明的子树,如下所示:

(IS TYPE (x) (INT))
也就是说x是INT型的


在我的代码生成器中是否应该有一个案例来处理这些类型声明?或者这只是为了让语义分析器进行类型检查,所以我应该假设类型已经检查过,忽略树的这一部分,并简单地为x赋值?

如果这是一个声明

(IS TYPE (x) (INT))
那么x应该放在内存中。对于C和自动变量,本地自动变量在堆栈上分配。要分配所需的堆栈大小,您应该知道所有本地变量的大小以及大小都来自类型

如果此变量存储在寄存器中,则应选择所需大小的寄存器(想想x86:AL、AX、EAX、RAX-同一个寄存器具有不同的大小),如果目标具有这样的寄存器

此外,当AST中存在不明确的操作时,需要输入类型,该操作可以对不同的数据大小(例如char、short、int或8位、16位、32位等)进行操作。对于某些汇编程序,数据的大小被编码到指令本身中;所以codegen应该记住变量的大小

或者,如果操作类型未记录在AST中,则添加:

(ADD (x) (y))

可能意味着同时添加浮点和整数(
ADD
FADD
指令),因此在codegen中需要x和y类型来选择正确的变量。

这两种情况都是可能的,您需要更多地描述您的语言,看看您是否真的需要将该功能添加到代码生成器中,或者不必要地跳过它,避免在设计编程语言这一困难而有趣的话题上做额外的工作

您的“代码生成器”是一个程序,它以一种编程语言(可能是小语言)作为输入代码接收,并以另一种编程语言(可能是小语言)输出代码

此工具通常称为“翻译器”

“代码生成器”是一个程序,它接收一种编程语言作为输入,并输出类似于汇编语言/字节码的编程语言吗

这个工具通常被称为“编译器”

注:“堆积”是“堆叠”的同义词

通常A.S.T.存储操作类型或函数调用。例如,在c中:

...
int a = 3;
int b = 5;
float c = (float)(a * b);
...
最后一行生成与此类似的A.S.T.(跳过其他行的A.S.T.):

请注意“(float)”像运算符或函数一样强制转换, 与你的问题类似


祝你好运。

这要看情况而定。任何涉及
x
的表达式是否会根据
x
的类型改变行为?知道类型后,您能生成更好的代码吗?等
..................................................................
..................................................................
......................+--------------+............................
......................|    [root]    |............................
......................| (no type) =  |............................
......................+------+-------+............................
.............................|....................................
.................+-----------+------------+.......................
.................|........................|.......................
...........+-----+-----+....+-------------+-------------+.........
...........| (int) c   |....| (float) (cast operation)  |.........
...........+-----------+....+-------------+-------------+.........
..........................................|.......................
....................................+-----+-----+.................
....................................| (int) ()  |.................
....................................+-----+-----+.................  
..........................................|.......................
....................................+-----+-----+.................
....................................| (int) *   |.................
....................................+-----+-----+.................
..........................................|.......................
..............................+-----------+-----------+...........
..............................|.......................|...........
........................+-----+-----+...........+-----+-----+.....
........................| (int)  a  |...........| (float) b |.....
........................+-----------+...........+-----------+.....
..................................................................
..................................................................