注:
課程:《編譯技術》上機
實驗一:詞法語法分析器的設計與實作,生成抽象語法樹,
建議使用詞法語法分析程式生成工具如:LEX/FLEX , YACC/BISON等專業工具完成,
此處完成補充 for回圈 的操作
另外:希望大噶支持下我滴個人博客網站:www.xyzsh.cn
文章有更新的話,個人網站會優先發出來的(CSDN有審核)
希望大概可以去踩一踩~!
前期準備
- 已完成上一篇文章中的補充char操作
- 已經將整個檔案夾都備好份,以供魔改后的回溯

開始實驗
第一步
?修改lex.l檔案(lex描述檔案給出了每一類詞法單元的規則)
- 第37行插入對字串for的識別
- 第38行插入對字串break的識別
- 第39行插入對字串continue的識別

第二步
?修改parser.y檔案(parser.y是C語言文法)
- 第36行插入單詞聲名FOR BREAK CONTINUE

- 修改Stmt第92行插入for的陳述句
?解釋一下Stmt指代是陳述句,for回圈整體算作一個陳述句在這里定義FOR LP Def Exp SEMI Exp RP Stmt
(對照著for(int a=0;a<10;a++){printf(" %d ",a);}來看)
LP是左括號,
Def是變數定義陳述句,因為Def包含分號;,所以下一個直接接上了Exp
Exp是復合運算式/陳述句(不帶分號;)
SEMI是分號
又來一個EXP,a++可以看做是一個復合運算式的
Rp是右括號
Stmt,我想用的是Stmt:Compst這個文法,
Compst是函式體,有大括號包起來的變數定義串列+陳述句串列

{$$=mknode(4,FOR,yylineno,$3,$4,$6,$8);}的含義
mknode是創建子節點的函式,
4表示創建4個節點
FOR是該文法的標識(type)
yylineno是當前行數
$3,$4,$6,$8分別對應Def Exp Exp Stmt(幾個非終結符)
- 第125-126行插入break,continue的文法
終結符不用創建子節點,所以mknode的第一個引數為0

第三步
?修改ast.c檔案(ast.c定義了樹的生成與輸出)
- 在第83行插入for的輸出
?感覺不需要解釋,每一個陳述句都是順其自然的
先輸出For回圈聲名,這是父節點,然后子節點有四個,每個都indent+3
而indent+6是子節點的內部定義,是子節點的子節點

- 第93行插入break,contiue的輸出

補:解釋一下 printf("% * cCHAR:%c\n",indent,’ ',T->type_char);的含義:先列印indent個空格,再列印CHAR:%c
默認低一級的話,往后移3個空格
第四步
?修改test.c檔案(測驗代碼)
- 第16-19行是測驗for回圈
- 第18行是測驗break
- 第25是測驗continue

結果檢驗
?依次運行
flex lex.l
bison -d parser.y
gcc -o parser lex.yy.c parser.tab.c ast.c
parser test.c

?發現有亂碼,使用chcp 65001切換到UTF-8編碼界面

?for回圈輸出完成!
?break輸出完成!

?continute輸出完成!
?for回圈補充完成啦!有沒有感覺自己又會了hhhhhh
寫在結尾
希望以上可以幫到你!
如有錯誤,或不同想法,歡迎指出,互相學習共同進步!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218808.html
標籤:其他
上一篇:TCP擁塞控制原理
