第一個(gè)作業(yè)是根據(jù)這門(mén)課定義的cool語(yǔ)言,寫(xiě)一個(gè)詞法分析的rule,詞法分析對(duì)我?guī)椭淮螅饕抢斫馐褂镁涂梢裕痛蟛糠謪⒄誫ithub上的實(shí)現(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) 實(shí)驗(yàn)的主要內(nèi)容是在cool.flex中增加對(duì)關(guān)鍵字,注釋,嵌入注釋,字符串的處理。在cool.flex內(nèi)部定義好規(guī)則時(shí)候,make flexer 時(shí),會(huì)調(diào)用flex. flex 輸入cool.flex, 輸出cool-lex.cc,這個(gè)就是flex自動(dòng)產(chǎn)生的處理詞法的代碼。
3)產(chǎn)生flex后,可以調(diào)用perl pa1-grading.pl,打分會(huì)報(bào)告哪些沒(méi)有處理好
4)沒(méi)有處理好的
對(duì)于這種,可以直接grep “l(fā)ine number test 2”,查看時(shí)那個(gè)文件沒(méi)有處理好。./grading 目錄下有一堆輸入文件
可以直接調(diào)用 ./lexer ./gool.cool 或者出錯(cuò)的文件 ./lexer ./lineno2.cool
它會(huì)根據(jù)我們輸入的規(guī)則,print信息。
我的問(wèn)題是注釋里面遇到換行,沒(méi)有增加linenumber,在comment里面加上遇到換行符時(shí),遞增linenumber就對(duì)了。
上面是環(huán)境的問(wèn)題,下面是除了課程的資料以外需要了解的內(nèi)容。
背景知識(shí)
遇到的問(wèn)題我就直接問(wèn)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(),用來(lái)繼續(xù)處理token的內(nèi)容;另一個(gè)就是yytext 則是表示當(dāng)前匹配的內(nèi)容。這里主要是講數(shù)字,字符串以及自定義的object與符號(hào)表中的內(nèi)容連接起來(lái)。
2) 如何編寫(xiě)cool.flex
對(duì)于關(guān)鍵字的支持比較簡(jiǎn)單,主要還是支持字符串和注釋,以及嵌套注釋。
這里就是狀態(tài)機(jī),初始時(shí)和正常狀態(tài)下都處于INITIAL狀態(tài),cool語(yǔ)言時(shí)的注釋以(*開(kāi)頭,考慮到會(huì)存在嵌套注釋,因此在INITIAL,COMMENTS,INLINE_COMMENTS三種狀態(tài)下,都可能會(huì)遇到(*此時(shí)我們進(jìn)入COMMENTS狀態(tài),因此BEGIN COMMENTS。
"(*" { comment_layer++; BEGIN COMMENTS; }
在注釋中,遇到非特殊字符,不需要特殊處理,可以直接忽視,因此{(lán)}內(nèi)部都為空。
[^n(*]* { } [()*] { }
在遇到換行符時(shí),增加行數(shù)計(jì)數(shù)。
{ curr_lineno++; }
這里的comment_layer–與上面的comment_layer++對(duì)應(yīng),進(jìn)入comment時(shí)遞增,出comment遞減,主要是為了應(yīng)對(duì)嵌套注釋。在走到最外層時(shí),回到INITIAL狀態(tài)。
"*)" { comment_layer--; if (comment_layer == 0) { BEGIN INITIAL; } }
總結(jié)來(lái)說(shuō), 就是下面的這個(gè)規(guī)則
DEFINED STATE { Action }
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19317瀏覽量
230097 -
字符串
+關(guān)注
關(guān)注
1文章
579瀏覽量
20546 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27557
原文標(biāo)題:Stanford 編譯原理 編程作業(yè)1
文章出處:【微信號(hào):處理器與AI芯片,微信公眾號(hào):處理器與AI芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論