Parsing 编译器.AST中类型声明的指令选择
我正在学习编译器,并为一种处理两种类型的简单语言创建代码生成器:字符和整数 在用户输入被扫描器扫描并被解析器解析之后,我得到输入的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型的 在我的代码生成器中是否应该有一个案例来处理这些类型声明?或者这只是为了让语义分析器进行类型检查,所以我应该假设类型已经检查过,忽略树的这一部分,并简
(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 |.....
........................+-----------+...........+-----------+.....
..................................................................
..................................................................