小型编译程序的设计与实现

上传人:博****1 文档编号:508589665 上传时间:2023-09-24 格式:DOC 页数:30 大小:241KB
返回 下载 相关 举报
小型编译程序的设计与实现_第1页
第1页 / 共30页
小型编译程序的设计与实现_第2页
第2页 / 共30页
小型编译程序的设计与实现_第3页
第3页 / 共30页
小型编译程序的设计与实现_第4页
第4页 / 共30页
小型编译程序的设计与实现_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《小型编译程序的设计与实现》由会员分享,可在线阅读,更多相关《小型编译程序的设计与实现(30页珍藏版)》请在金锄头文库上搜索。

1、小型编译程序的设计与实现本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码(四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序分为三个部分:(1) 词法分析部分(2) 语法分析、语义分析及四元式生成部分(3) 输出显示部分1 词法分析器设计词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别编码,单词自身的值)由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检

2、查。1.1 单词符号的内部定义及在编译程序中的定义我们对常量、变量、临时变量、保留关键字(if、while、begin、end、else、then、do等)、关系运算符、逻辑运算符、分号、括号等,规定其内部定义如下:符 号种别编码说 明sy_if0保留字 ifsy_then1保留字 thensy_else2保留字 elsesy_while3保留字 whilesy_begin4保留字 beginsy_do5保留字 dosy_end6保留字 enda7赋值语句semicolon8“ ; ”e9布尔表达式Jinghao10“ # ”S11语句L12复合语句Tempsy15临时变量EA18B and(

3、即布尔表达式中的B)EO19B or(即布尔表达式中的B )Plus34“ + ”Times36“ * ”Becomes38“ := ” 赋值Op_and39“ and ”Op_or40“ or ”Op_not41“ not ”Rop42关系运算符Lparent48“ ( ”Rparent49“ ) ”Ident56变量Intconst57整常量#include stdio.h/*如果使用TC的话,需要配置头文件路径*/#include string.h#define ACC -2/*/#define sy_if 0#define sy_then 1#define sy_else 2#defi

4、ne sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define jinghao 10#define S 11#define L 12#define tempsy 15#define EA 18 /*E and*/#define E0 19 /E or*/#define plus 34#define times 36#define becomes 38#define op_and 39#define op_or 40#define op_n

5、ot 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 571.2 变量及数据结构说明编译程序中涉及到的变量及数据结构说明如下:char ch=0; /*从字符缓冲区读取当前字符*/int count=0; /*词法分析结果缓冲区计数器*/static char spelling10=; /*存放识别的字*/static char line81=; /*一行字符缓冲区,最多80个字符*/char *pline; /*字符缓冲区指针*/static char ntab11001

6、0; /*变量名表,共100项,每项长度10*/struct ntabint tc; /*真值*/int fc; /*假值*/ntab2200; /*在布尔表达式E中保存有关布尔变量的真、假值*/int label=0; /*指向ntab2的指针*/struct rwordschar sp10;int sy; /*保留字表的结构,用来与输入缓冲区中的单词进行匹配*/struct rwords reswords10=if,sy_if,do,sy_do,else,sy_else,while,sy_while,then,sy_then,begin,sy_begin,end,sy_end,and,op

7、_and,or,op_or,not,op_not; /*保留字表初始化,大小为10*/struct aaint sy1; /*存放单词的种别编码*/int pos; /*存放单词自身的值*/buf1000, /*词法分析结果缓冲区*/n, /*读取二元式的当前字符*/n1, /*当前表达式中的字符*/E, /*非终结符*/sstack100, /*算术或布尔表达式加工处理使用的符号栈*/ibuf100, /*算术或布尔表达式使用的缓冲区*/stack1000; /*语法分析加工处理使用的符号栈*/struct aa oth; /*四元式中的空白位置*/struct fourexpchar op

8、10;struct aa arg1;struct aa arg2;int result;fexp200; /*四元式的结构定义*/int ssp=0; /*指向sstack栈指针*/struct aa *pbuf=buf; /*指向词法分析缓冲区的指针*/int nlength=0; /*词法分析中记录单词的长度*/int tt1=0; /*变量名表指针*/char *cfile; /*源程序文件,为结束符*/int lnum=0; /*源程序行数记数*/int sign=0; /*sign=1为赋值语句;=2为while语句;=3为if语句*/*/int newt=0; /*临时变量计数器*

9、/int nxq=100; /*nxq总是指向下一个将要形成的四元式地址,*/*每次执行gen()时,地址自动增1*/int lr; /*扫描LR分析表1过程中保存的当前状态值*/int lr1; /*扫描LR分析表2或表3所保存的当前状态值*/int sp=0; /*查找LR分析表时状态栈的栈顶指针*/int stack1100; /*状态栈1定义*/int sp1=0; /*状态栈1的栈顶指针*/int num=0; /*算术或布尔表达式缓冲区指针*/struct llint nxq1; /*记录下一条四元式的地址*/ int tc1; /*真值链*/int fc1; /*假值链*/lab

10、elmark10; /*记录语句嵌套层次的数组,*/*即记录嵌套中每层的布尔表达式E的首地址*/int labeltemp10; /*记录语句嵌套层次的数组,*/*即记录每层else之前的四元式地址*/int pointmark=-1, /*labelmark数组指针*/pointtemp=-1; /*labeltemp数组指针*/1.3 主函数main()void main()cfile=fopen(pas.dat,r); /*打开C语言源文件*/readch(); /*从源文件读一个字符*/scan(); /*词法分析*/disp1();disp3();stacksp.pos=0;stac

11、ksp.sy1=-1; /*初始化状态栈*/stack1sp1=0; /*初始化状态栈1*/oth.sy1=-1;printf(n* 状态栈变化过程以及归约顺序 *n);readnu(); /*从二元式读入一个符号*/lrparse(); /*语法语义分析产生四元式*/getch();disp2();printf(n程序运行结束!n);getch();1.4 词法分析函数说明(1) 读取函数 readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件会影响程序执行效率,故实际上是从源程序文件“pas.dat”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch()从输入缓冲区获得的;若缓冲区已被读空,则再执行readline()从pas.dat中读取下一行至输入缓冲区。/*从文件读一行到缓冲区*/readline()char ch1;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号