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

时间:2011-11-18 14:57:33

标签: parsing compiler-construction types code-generation semantic-analysis

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

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

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

(IS TYPE (x) (INT))

表示x的类型为INT。

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

2 个答案:

答案 0 :(得分:1)

如果这是声明

(IS TYPE (x) (INT))

然后x应该在内存中布局。在C和自动变量的情况下,在堆栈上分配本地自动变量。要分配所需的堆栈大小,您应该知道所有本地变量和大小的大小来自类型。

如果这个变量存储在一个寄存器中,你应该选择一个所需大小的寄存器(考虑x86:AL,AX,EAX,RAX - 具有不同大小的相同寄存器),如果你的目标有这样的话。

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

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

(ADD (x) (y))

可能意味着浮点数和整数加法(ADDFADD指令),因此在codegen中需要x和y的类型来选择正确的变体。

答案 1 :(得分:1)

这两种情况都是可能的,您需要更多地描述您的语言,看看您是否确实需要将该功能添加到代码生成器中,或者将其作为不必要的内容添加,并避免额外的工作来解决这个困难而有趣的设计主题编程语言。

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

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

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

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

注意:“pile”是“stack”的同义词。

通常是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 |.....
........................+-----------+...........+-----------+.....
..................................................................
..................................................................

请注意,“(float)”将其类似于运算符或函数, 类似于你的问题。

祝你好运。