編譯原理實驗2:語法分析

URNOTJANET發表於2017-12-13

2017-4-27

實驗概述

•實驗內容:用bison工具生成一個PL/0語言的語法分析程式,對PL/0源程式進行語法分析,並按語法歸約過程輸出歸約時所用的語法規則。

•實驗環境:

•語法分析器生成工具:bison

•程式語言:C

YACC概述(1)

YACC = Yet Another Compiler Compiler

YACC是一個語法分析程式的自動產生系統

編譯原理實驗2:語法分析
編譯原理實驗2:語法分析

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介面)

相關文章