第一個作業(yè)是根據(jù)這門課定義的cool語言,寫一個詞法分析的rule,詞法分析對我?guī)椭淮?,主要是理解使用就可以,就大部分參照github上的實現(xiàn)了。
Workflow
1)cool/include/PA2/cool-parse.h 里面定義了需要處理的關(guān)鍵字
/* Tokens. */ #define CLASS 258 #define ELSE 259 #define FI 260 #define IF 261 #define IN 262 #define INHERITS 263 ....
2) 實驗的主要內(nèi)容是在cool.flex中增加對關(guān)鍵字,注釋,嵌入注釋,字符串的處理。在cool.flex內(nèi)部定義好規(guī)則時候,make flexer 時,會調(diào)用flex. flex 輸入cool.flex, 輸出cool-lex.cc,這個就是flex自動產(chǎn)生的處理詞法的代碼。
3)產(chǎn)生flex后,可以調(diào)用perl pa1-grading.pl,打分會報告哪些沒有處理好
4)沒有處理好的
對于這種,可以直接grep “l(fā)ine number test 2”,查看時那個文件沒有處理好。./grading 目錄下有一堆輸入文件
可以直接調(diào)用 ./lexer ./gool.cool 或者出錯的文件 ./lexer ./lineno2.cool
它會根據(jù)我們輸入的規(guī)則,print信息。
我的問題是注釋里面遇到換行,沒有增加linenumber,在comment里面加上遇到換行符時,遞增linenumber就對了。
上面是環(huán)境的問題,下面是除了課程的資料以外需要了解的內(nèi)容。
背景知識
遇到的問題我就直接問chatgpt了。
1)Flex支持的函數(shù):
yymore(): As mentioned earlier, this function is used to accumulate text from multiple rule matches before taking action. It’s particularly useful when you want to combine consecutive matches into a single token.
yytext: As discussed before, this global variable holds the current matched text or lexeme. It’s automatically populated by Flex based on the pattern that matches.
yylineno: This global variable keeps track of the current line number being processed by the lexer. You can use it to maintain accurate line number information for error reporting or other purposes.
我列出了主要用的,主要用的還是yymore(),用來繼續(xù)處理token的內(nèi)容;另一個就是yytext 則是表示當(dāng)前匹配的內(nèi)容。這里主要是講數(shù)字,字符串以及自定義的object與符號表中的內(nèi)容連接起來。
2) 如何編寫cool.flex
對于關(guān)鍵字的支持比較簡單,主要還是支持字符串和注釋,以及嵌套注釋。
這里就是狀態(tài)機,初始時和正常狀態(tài)下都處于INITIAL狀態(tài),cool語言時的注釋以(*開頭,考慮到會存在嵌套注釋,因此在INITIAL,COMMENTS,INLINE_COMMENTS三種狀態(tài)下,都可能會遇到(*此時我們進入COMMENTS狀態(tài),因此BEGIN COMMENTS。
"(*" { comment_layer++; BEGIN COMMENTS; }
在注釋中,遇到非特殊字符,不需要特殊處理,可以直接忽視,因此{}內(nèi)部都為空。
[^n(*]* { } [()*] { }
在遇到換行符時,增加行數(shù)計數(shù)。
{ curr_lineno++; }
這里的comment_layer–與上面的comment_layer++對應(yīng),進入comment時遞增,出comment遞減,主要是為了應(yīng)對嵌套注釋。在走到最外層時,回到INITIAL狀態(tài)。
"*)" { comment_layer--; if (comment_layer == 0) { BEGIN INITIAL; } }
總結(jié)來說, 就是下面的這個規(guī)則
DEFINED STATE { Action }
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19103瀏覽量
228826 -
字符串
+關(guān)注
關(guān)注
1文章
575瀏覽量
20470 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
491瀏覽量
27458
原文標(biāo)題:Stanford 編譯原理 編程作業(yè)1
文章出處:【微信號:處理器與AI芯片,微信公眾號:處理器與AI芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論