预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验题目C语言编译器的设计与实现 小组合作否姓名班级11级专升本学号一、实验目的: 1、了解语法编译器的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法。 2、加深对语法编译器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。二、实验环境: 需要一台拥有WINDOWSXP的计算机。三、实验步骤: 我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分: (1)词法分析部分 (2)语法分析处理及四元式生成部分 (3)输出显示部分编译程序中涉及到的数据结构说明如下: charch='\0';/*从字符缓冲区中读取当前字符*/ intcount=0;/*词法分析结果缓冲区计数器*/ staticcharspelling[10]={""};/*存放识别的字*/ staticcharline[81]={""};/*一行字符缓冲区(最多80个字符)*/ char*pline;/*字符缓冲区指针*/ staticcharntab1[100][10];/*变量名表:共100项,每项长度为10*/ structntab { inttc;/*真值*/ intfc;/*假值*/ }ntab2[200];/*在布尔表达式)中保存有关布尔变量的真、假值*/ intlabel=0;/*指向ntab2的指针*/ structrewords { charsp[10]; intsy; };/*匹配表的结构,用来与输入缓冲区中的单词进行匹配*/ structrewordsrewords[8]= {{"if",syl_if}, {"else",syl_else}, {"while",syl_while}, {"{",syl_begin}, {"}",syl_end}, {"&&",op_and}, {"||",op_or}, {"!",op_not}};/*匹配表初始化,大小为8*/ structaa{ intsyl;/*存放名字*/ intpos;/*存放名字所对应的值*/ }buf[100],/*词法分析结果缓冲区*/ n,/*读取二元式的当前字符*/ n1,/*当前表达式中的字符*/ E,/*非终结符*/ sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/ ibuf[100],/*算术或布尔表达式使用的缓冲区*/ stack[1000];/*语法分析加工处理使用的符号栈*/ structaaoth;/*四元式中空白位置*/ structfourexp { charop[10]; structaaarg1; structaaarg2; intresult; }fexp[200];/*四元式的结构定义*/ intssp=0;/*指向sstack栈指针*/ structaa*pbuf=buf;/*指向词法分析缓冲区的指针*/ intnlength=0;/*词法分析中记录单词的长度*/ inttt1=0;/*变量名表指针*/ FILE*cfile;/*源程序文件,~为结束符*/ intlnum=0;/*源程序行数记数*/ intsign=0;/*sign=0为赋值语句;sign=1为while语句;sign=3为if语句*/ intnewt=0;/*临时变量计数器*/ intnxq=100;/*nxq总是指向下一个将要形成的四元式地址,每次执行gen()时,地址自动增1*/ intlr;/*扫描LR分析表1过程中保存的当前状态值*/ intlr1;/*扫描LR分析表2或表3所保存的当前状态值*/ intsp=0;/*查找LR分析表时状态栈的栈顶指针*/ intstack1[100];/*状态栈1定义*/ intsp1=0;/*状态栈1的栈顶指针*/ intnum=0;/*算术或布尔表达式缓冲区指针*/ structll{ intnxq1;/*记录下一条四元式的地址*/ inttc1;/*真值链*/ intfc1;/*假值链*/ }labelmark[10];/*记录语句嵌套层次的数组,即记录嵌套中每层的布尔表达式e的首地址*/ intlabeltemp[10];/*记录语句嵌套层次的数组,即记录每一层else之前的四元式地址*/ intpointmark=-1;/*labelmark数组指针*/ intpointtemp=-1;/*labeltemp数组指针*/ 五.编译程序运行测试 测试source.dat得源程序如下: while(