第二部分的作業是語法分析,通過編寫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文章
4368瀏覽量
64175 -
代碼
+關注
關注
30文章
4886瀏覽量
70242 -
編譯
+關注
關注
0文章
676瀏覽量
33743
原文標題:Stanford 編譯原理 編程作業2
文章出處:【微信號:處理器與AI芯片,微信公眾號:處理器與AI芯片】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
一文詳解編譯系統
gcc編譯出錯
WinCE系統的編譯過程詳解

Vivado中的Incremental Compile增量編譯技術詳解
Linux內核編譯過程詳解
編譯器是如何工作的_編譯器的工作過程詳解
Php+mysql+apache編譯安裝詳述

詳解OpenHarmony的編譯和燒錄

C語言中條件編譯詳解
Stanford DG645開機無反應維修:安泰維修過程分享

評論