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

NO IMAGE

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

相關文章

計算機網絡實驗10:靜態路由協議

數據庫實驗2掌握DBMS常用工具

VMware下安裝Ubuntu遇到的問題及解決方案

計算機網絡實驗六:無線接入