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