第二部分的作業是語法分析,通過編寫cool.y(這個assignment的任務),利用bison將其自動生成語法分析LALR(1)的代碼。
語法分析,就是將詞法分析階段已經識別好的token,按照語法的規則,構建抽象語法樹的過程。
比如以下的代碼:
x=(a+b)*(c-d);
可以構成下圖的抽象語法樹:
=
/
x *
/
+ -
/ /
abcd
具體在cool.y 中,

這部分定義了非終結符non-terminal對應的semanticvalue. Union中的每一個field都可以是parsing動作的結果。
在stanfordcompiler的教學語言cool中,這就對應了AST的一個node。每一個non-terminal,都有其對應的semanticvalue。
左側的各種類型在cool-tree.aps中都有對應定義,比如Features:

Feature即為class中的成員函數或者成員變量。因為可以有多個Feature,所以存在Features,即LIST[Feature].
下面則具體定義了所有的非終結符對應的AST節點類型。<>內部的,比如classes是在union中定義的value,而右側的,比如class_list,我們需要定義規約該非終結符時,需要進行的操作。

上圖中$$即為action的返回值,對應該抽象語法樹AST對應的node。
下面介紹如何聲明非終結符對應的規約操作。

具體如何對類的聲明構建抽象語法樹節點,即class的規則:
1)
CLASS TYPEID '{' feature_list '}' ';'
{
/*對應動作 action*/
$$=class_($2,
idtable.add_string("Object"),
$4,
stringtable.add_string(curr_filename));
}
其動作對應cool-tree.aps中生命的constructor,

傳給class_的參數即為
1)類名稱 2)父類名稱 3)成員變量/成員函數
4)文件名
對應的位置如類名稱即為TYPEID,對應$2, feature_list對應$4,因此其動作action寫成了如上圖所示的樣子。
cool語法中,如果class類沒有繼承自其他類,那么默認繼承自Object類型,因此parent設置為Object。
2)
CLASS TYPEID INHERITS TYPEID '{' feature_list '}' ';'
{$$=class_($2,$4,$6,
stringtable.add_string(curr_filename));}
這里唯一不同的即為該類繼承自父類,因此其第2個參數,父類名稱傳入了$4。具體的序號可以參考第205行的注釋。
審核編輯:湯梓紅
-
函數
+關注
關注
3文章
4417瀏覽量
67501 -
代碼
+關注
關注
30文章
4968瀏覽量
73960 -
編譯
+關注
關注
0文章
694瀏覽量
35158
原文標題:Stanford 編譯原理 編程作業2
文章出處:【微信號:處理器與AI芯片,微信公眾號:處理器與AI芯片】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
一文詳解SystemC仿真庫的編譯
一文詳解編譯系統
WinCE系統的編譯過程詳解
Vivado中的Incremental Compile增量編譯技術詳解
Linux內核編譯過程詳解
編譯器是如何工作的_編譯器的工作過程詳解
Php+mysql+apache編譯安裝詳述
詳解OpenHarmony的編譯和燒錄
C語言中條件編譯詳解
斯坦福(Stanford)鎖相放大器故障修復
Stanford編譯原理詳解
評論