1

我正在学习编译器并为处理两种类型的简单语言创建代码生成器:字符和整数。编译器 - 指令选择AST中的类型声明

在扫描仪扫描完用户输入并被解析器解析后,我得到了输入的AST表示。我为更简单的语言做了代码生成,它只处理整数,运算符和变量表达式。

但是这个新的语言,我有时会得到一个子树的类型声明,就像这样:

(IS TYPE (x) (INT)) 

它说X是int类型。

我的代码生成器中是否存在处理这些类型声明的情况?或者这只是为了语义分析器类型检查,所以我应该假设类型已被检查并忽略树的这一部分,并简单地为x赋值?

+0

这取决于。涉及'x'的任何表达式是否根据'x'的类型改变行为?你知道这个类型能产生更好的代码吗?等等 – delnan

回答

1

如果这是一个声明

(IS TYPE (x) (INT)) 

则x应在内存中排列。在C和自动变量的情况下,本地自动变量分配在堆栈上。要分配需要的堆栈大小,您应该知道所有本地变量的大小和大小都来自类型。如果这个变量存储在一个寄存器中,你应该选择一个所需大小的寄存器(如果你的目标是这样的话,可以考虑使用x86,AL:AX,EAX,RAX--同一个寄存器,大小不一)。当AST中存在模糊操作时,可以使用不同的数据大小(例如char,short,int或8位,16位,32位等),所以需要type。而对于一些汇编程序,数据的大小被编码为指令本身;所以codegen应该记住变量的大小。

或者,如果操作的类型在AST未记录时,ADD:

(ADD (x) (y)) 

可能意味着两个浮子和int附加(ADDFADD指令),所以需要在类型x和y的codegen选择正确的变体。

1

这两种情况是可能的,你需要描述你的语言多了,看看你是否真的需要这个功能添加到您的代码生成器,或跳过不必要的,并避免与这个困难和有趣的话题额外的工作设计一种编程语言。

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

这个工具通常被称为“翻译”。

“代码生成器”是一种程序,它接收一种编程语言作为输入并输出像编程语言那样的汇编/字节代码?

该工具通常称为“编译器”。

注:“堆”是“堆”的同义词。

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

... 
int a = 3; 
int b = 5; 
float c = (float)(a * b); 
... 

最后一行生成A.S.T.与此类似,(跳过A.S.T.其他行):

.................................................................. 
.................................................................. 
......................+--------------+............................ 
......................| [root] |............................ 
......................| (no type) = |............................ 
......................+------+-------+............................ 
.............................|.................................... 
.................+-----------+------------+....................... 
.................|........................|....................... 
...........+-----+-----+....+-------------+-------------+......... 
...........| (int) c |....| (float) (cast operation) |......... 
...........+-----------+....+-------------+-------------+......... 
..........................................|....................... 
....................................+-----+-----+................. 
....................................| (int)() |................. 
....................................+-----+-----+................. 
..........................................|....................... 
....................................+-----+-----+................. 
....................................| (int) * |................. 
....................................+-----+-----+................. 
..........................................|....................... 
..............................+-----------+-----------+........... 
..............................|.......................|........... 
........................+-----+-----+...........+-----+-----+..... 
........................| (int) a |...........| (float) b |..... 
........................+-----------+...........+-----------+..... 
.................................................................. 
.................................................................. 

注意“(浮动)”铸就了它像操作员或功能, 类似于你的问题。

祝你好运。