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

gcc編譯出錯
WinCE系統(tǒng)的編譯過程詳解

QT/E和Qtopia的編譯詳解
PICC編譯器的庫函數(shù)詳解
Vivado中的Incremental Compile增量編譯技術(shù)詳解
Linux內(nèi)核編譯過程詳解
編譯器是如何工作的_編譯器的工作過程詳解
Php+mysql+apache編譯安裝詳述

詳解OpenHarmony的編譯和燒錄

C語言中條件編譯詳解
Stanford編譯的原理是什么?

Stanford DG645開機無反應(yīng)維修:安泰維修過程分享

評論