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 |..... 
........................+-----------+...........+-----------+..... 
.................................................................. 
.................................................................. 

注意「(浮動)」鑄就了它像操作員或功能, 類似於你的問題。

祝你好運。