第二部分的作業(yè)是語法分析,通過編寫cool.y(這個assignment的任務),利用bison將其自動生成語法分析LALR(1)的代碼。
語法分析,就是將詞法分析階段已經(jīng)識別好的token,按照語法的規(guī)則,構(gòu)建抽象語法樹的過程。
比如以下的代碼:
x=(a+b)*(c-d);
可以構(gòu)成下圖的抽象語法樹:
= / x * / + - / / abcd
具體在cool.y 中,
這部分定義了非終結(jié)符non-terminal對應的semanticvalue. Union中的每一個field都可以是parsing動作的結(jié)果。
在stanfordcompiler的教學語言cool中,這就對應了AST的一個node。每一個non-terminal,都有其對應的semanticvalue。
左側(cè)的各種類型在cool-tree.aps中都有對應定義,比如Features:
Feature即為class中的成員函數(shù)或者成員變量。因為可以有多個Feature,所以存在Features,即LIST[Feature].
下面則具體定義了所有的非終結(jié)符對應的AST節(jié)點類型。<>內(nèi)部的,比如classes是在union中定義的value,而右側(cè)的,比如class_list,我們需要定義規(guī)約該非終結(jié)符時,需要進行的操作。
上圖中$$即為action的返回值,對應該抽象語法樹AST對應的node。
下面介紹如何聲明非終結(jié)符對應的規(guī)約操作。
具體如何對類的聲明構(gòu)建抽象語法樹節(jié)點,即class的規(guī)則:
1)
CLASS TYPEID '{' feature_list '}' ';' { /*對應動作 action*/ $$=class_($2, idtable.add_string("Object"), $4, stringtable.add_string(curr_filename)); }
其動作對應cool-tree.aps中生命的constructor,
傳給class_的參數(shù)即為
1)類名稱 2)父類名稱 3)成員變量/成員函數(shù)
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個參數(shù),父類名稱傳入了$4。具體的序號可以參考第205行的注釋。
審核編輯:湯梓紅
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62950 -
代碼
+關(guān)注
關(guān)注
30文章
4823瀏覽量
69008 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
33029
原文標題:Stanford 編譯原理 編程作業(yè)2
文章出處:【微信號:處理器與AI芯片,微信公眾號:處理器與AI芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論