2017-4-27
實驗概述
•實驗內容:用bison工具生成一個PL/0語言的語法分析程式,對PL/0源程式進行語法分析,並按語法歸約過程輸出歸約時所用的語法規則。
•實驗環境:
•語法分析器生成工具:bison
•程式語言:C
YACC概述(1)
YACC = Yet Another Compiler Compiler
YACC是一個語法分析程式的自動產生系統
YACC的處理能力:可以用LALR(1)文法表示的上下文無關文法。
語法規則的寫法
格式: 左部(非終結符):右部(文法符號串);
非終結符名稱通常用小寫字母,終結符名稱通常用大寫字母。
右部為空表示左部的非終結符可以匹配空串。
左部相同的語法規則應儘量合併。
需要遞迴時,儘量使用左遞迴。
例如 StmtList : /* empty */
| StmtList Stmt
;
語義動作的寫法
語義動作用{ }括起來,其中的語句要符合C語言文法。
語義動作出現在規則的尾部時,bison在歸約前執行它。
語義動作出現在規則的中間時,bison在識別出它前面的若干文法符號後執行它。
例如:expr : LPAREN expr RPAREN
{ $ = $2; }
| expr PLUS expr
{ $ = $1 + $3; }
| expr TIMES expr
{ $ = $1 * $3; }
文法符號的語義值
終結符的語義值由詞法分析程式給出,並儲存在yylval中。
非終結符的語義值在語義動作中獲得。
可以通過$偽變數訪問語義值
左部非終結符的語義值為$$
右部文法符號的語義值依次為$1,$2,…
例如 exp : NUM { $$ = $1; }
| exp '+' exp { $ = $1 + $3; }
;
使用者子程式
子程式用C語言書寫,將被原樣照抄到C語言檔案中。
如果子程式比較簡單,可以全都寫在YACC原始檔中。
如果子程式比較複雜,可以分別寫在幾個檔案中。
實現程式碼:
有兩個檔案,比較複雜我就不直接貼
分別有定義詞法分析的lex.l和定義輸出的語法結構的syntax.y檔案
用bison進行編譯之後得到標頭檔案syntax.tab.h和syntax.tab.c
用flex編譯後得到lex.yy.c
用code blocks或者VS 編譯執行,生成exe檔案後,隨便用樣例進行分析即可,語法分析輸出到標準流(即DOS介面)