编译原理实验指导 下载本文

基本字:begin(?{?, “NUL”}、end(?)?, “NUL”}、integer(?a?, “NUL”}、real(?c?, “NUL”}

标识符:(?i?, 字符串) 无符号整常数:(?x?, 字符串) 无符号实常数:(?y?, 字符串)

运算符;=(?=?, “NUL”)、+(?+?, “NUL”)、*(?*?, “NUL”)、++(?$?, “NUL”)

界符:,(?,?, “NUL”)、;(?;?, “NUL”)、((,C?,?, “NUL”) 、)?)?, ?NUL?)、#(?#?, “NUL”)

状态转换图

单词分为单字符单词或多字符单词。 实验步骤:

(1)熟悉习教材关于词法分析的原理。

(2)依照教材关于词法分析的算法,使用C/C++语言实现该算法。 (3)调试、编译、运行程序。 实验要求:

在下次实验时提交本次实验的实验报告(实验报告包括实验目的、实验内容、实验实现过程、源程序、实验结果、实验体会)。

7

实现代码:

词法分析有5个函数构成,即预处理函数pro_process、扫描函数scanner、拼接函数concat、查基本字表函数reserve和主函数main。

#include #include #include #include

const short WORDLEN=20; struct code_val{

char code; char val[WORDLEN]; }

void pro_process(char *); void concat(char [],char); char reserve(char[]);

code_val scanner(char *); void main() {

char buf[4048]={?\\0?}; pro_process(buf); cout<

ofstream coutf(“Lex_r.txt”,ios::out); code_val t; do {

t=scanner(buf); //调用一次scanner函数,获得一个单词二元式 coutf<

cout<<”end of lexical analysis”<

8

实验三 递归下降分析法

实验学时:2学时 实验目的:

掌握递归下降语法分析的原理

利用高级语言的递归过程为给定文法的每个非终结符构造对应的递归函数 实验内容:

若文法不含左递归,并且每个非终结符的所有候选式的首符集都两两不相交,就有可能构造一个不带回溯的自上而下的语法分析程序。这个分析程序是由一组递归过程(函数)组成的,每个过程(函数)对应文法的一个非终结符。如果用某种高级语言写出所有递归过程(函数),那就可以用这个高级语言的编译系统产生整个分析程序。这个分析程序称为递归下降分析器。

用类C语言为文法G的每个非终结符构造对应的递归函数。 文法G如下所示: E→TE? E?→+TE?|ε T→FT? T?→*FT?|ε F→(E)|i|x|y 实验步骤:

9

(1)熟悉习教材关于语法分析的原理。

(2)依照教材关于基于递归下降分析的算法,使用C/C++语言实现该算法。

(3)调试、编译、运行程序。 实验要求:

在下次实验时提交本次实验的实验报告(实验报告包括实验目的、实验内容、实验实现过程、源程序、实验结果、实验体会)。

10