编译原理词法语法语义分析器设计
更新时间:2023-07-18 04:50:01 阅读量: 实用文档 文档下载
编译技术课程设计
班 级 计算机0802 学 号 3080602049 姓 名 周勇 指导老师 朱玉全
二零一一年 七 月
编译技术课程设计
一、目的
<<编译技术>>是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
二、任务及要求
基本要求:
1. 词法分析器 产生下述小语言的单词序列
这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:
对于这个小语言,有几点重要的限制:
首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:
IF(5)=x
其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为
IF i>0 i= 1; 而绝对不要写成
IFi>0 i=1;
因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。
这个小语言的单词符号的状态转换图,如下图:
2. 语法分析器 能识别由加+ 减- 乘* 除/ 乘方^ 括号()操作数所组成的算术表达
式,其文法如下: E→E+T|E-T|T T→T*F|T/F|F F→P^F|P p→(E)|i
使用的算法可以是:;算符优先分析法;LR分析法等。
3. 中间代码生成器 产生上述算术表达式的中间代码(四元式序列) 较高要求:
1. 扩充上述小语言的单词;
2. 增加语法分析器的功能,能识别条件语句和循环语句等; 3. 增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元
式序列)
4. 增加报错功能;
5. 将中间代码翻译成汇编语言。
三、实现过程说明
给出各题目的详细算法描述,数据结构和函数说明,流程图。 (1) 词法分析器:
1算法描述:
词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号。通过DOS环境手动输入字符串序列(以’$’作为结束标志)作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若有不属于该语言单词符号出现,则进行出错处理),词法扫描子程序包括了对源程序的预处理(忽略、回车换行符等字符),以及对单词的识别和分类,以形成(单词种别,单词自身的值)形式的二元组。
具体思路如下: 首先建立关键字表,将关键字作为特殊标示符处理,把它们预先安排在char *keywords[13]中,将需要被识别出的关键字存入表中,当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
在主函数中让用户输入要识别的符号串,然后将输入的符号串读入到 program[500],遇$结束。再依次扫描program[500]中的每一个符号,调用Scan ()子函数分析每一个符号,再将分析的结果输出,也是遇$结束。
2函数说明和数据结构:
在Scan ()子函数中,先全部初始化,然后读一个字符,分析它是什么类型: 如果是字母类型,则接着往下读,直到读到非字母的字符,存入words[10]中,依次对比关键字表中的元素,如果相同,则将flags[]置为相应的种别码,如果全都扫描后没发现相同的关键字,则为普通的标识符,返回主函数输出。
如果是数字类型,首先分析第一个符号,接着读下一个字符串,直到读到一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字,使用辗转相乘法,每次都让number先自乘10,然后加上这个数字,这样就将字符串表示的数字转化成了相应的数,返回主函数输出。
如果是其他单词表的符号,则将他们的flags[]置为相应的种别码,并将字符存到words[] 中返回主函数输出。
主要变量说明: 用words[10]存放构成单词符号的字符串,并且用于判断是否为关键字。flags[500] 存放单词符号的种别码。Number存放整数值,words[]存放标识符,关键字或者其他符号。cnt[num]按顺序存放读到的字符,为下面语义分析做准备。Status用于判断是否为关键字,1是,0不是。
3
4. 流程图: 主流程图
扫描程序流程图:
(a),标识符词法分析流程图 (b), 数字(整)词法分析流程图 (c), 其他字符流程图
(a)
(b) (c)
(2) 语法分析器
1算法描述:
语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该语言的一个句子。
在语法分析阶段,采用自上而下的递归下降分析法,根据递归下降分析函数编写规则来编写相应的函数,在各个函数的分析过程中调用词法分析程序中的扫描程序,发出“取下一个单词符号”的命令,以取得下一个单词符号的语法分析。
词法分析和语法分析的整体设计思想可由以下图示表示:
语法分析是在词法分析的基础上加上判断是否符合语法规则的语句。语法分析的基本任务是使用词法分析的结果,使用递归下降算法分析是否符合语法规则,如果符合,则输出“分析成功”,若果不符合,则输出“分析失败”。
2.函数说明和数据结构
在main函数调用e()函数,如果调用之后返回时,如果((flags[temp]==0)&&is_right)为真,就输出“分析成功”,否则输出“分析失败”。其中is_right为设定的标志,初值为1,如果在调用子函数的过程中如果有错误,则置is_right为0。
e函数: 调用t函数,调用f函数, 调用p函数,返回后看是否是’+’或’-’,如果是,则调用 e1函数,再调用e2函数,如果不是,进行出错处理,置is_right为0。
e1函数:判断是不是”+”或者“-” 如果是,调用f函数,如果不是,进行出错处理,置is_right为0。
t函数: 调用f函数, 调用p函数,返回后看是否是’*’或’/’,如果是,则调用t1函数,再调用t2函数,如果不是,进行出错处理,置is_right为0。
t1函数:判断是不是”*”或者“/” 如果是,调用f函数,如果不是,进行出错处理,置is_right为0。
f函数:调用p函数,f1函数。
f1函数:判断是不是”^”,如果是,调用f函数,如果不是,进行出错处理,置is_right为0。
p函数: 检查是否标识符,如果是,调用f1函数,如果不是,检查是否是数值,如果是,调用f1函数,如果不是,检查是否是’(’,如果不是,进行出错处理,置is_right为0。如果是,调用e函数,返回后检查是否是’)’,如果不是,进行出错处理,置is_right为0。如果是,调用f1函数,返回。
3 流程图:
主流程图
e函数流程图:
p函数流程图:
t函数流程图:
f函数流程图:
(3) 中间代码生成器 1算法描述:
下面以简单算术表达式语句的翻译为例详细说明算法设计。 实现简单算术表达式的翻译一般采取下列步骤: i. 分析文法。
ii. 设置一系列语义变量,定义语义过程,语义函数。 iii. 设计算术表达式的递归下降子程序的程序分析算法。 2.函数说明和数据结构:
Strn用来存放临时变量的序号。
temp用来存放数组的下表,在主程序中语法分析结束后,置0.
定义函数newtemp()用于门生一个新的临时变量的名字,具体实现时每产生一个T,就及时送到符号表中,也可以不进符号表,直接将单词值用整数码表示。
定义函数siyuan(),输出一个四元式。 定义函数ye() 进行中间代码生成
3
主流程图 (4) 较高要求
i. 扩充上述小语言的单词;
ii. 增加语法分析器的功能,能识别条件语句和循环语句等;
iii. 增加中间代码生成器的功能,能产生条件语句和循环语句等的中
间代码(四元式序列) iv. 增加报错功能;
v. 将中间代码翻译成汇编语言。 其中1,4功能完成;
四.实验程序
#include "stdafx.h" #include <iostream> #include<string> using namespace std; #include<stdio.h> #include<stdlib.h> #include<sstream>
int i,j,k,flag,number,status;
/*status which is use to judge the string is keywords or not!*/ char ch;
char words[10] = {" "}; char program[500];
int flags[500]; //存储输入句子
string cnt[500];//标识符 int temp=0; //数组下标 int is_right; //判断输出信息
//-----------------------词法分析----------------------------- int Scan(char program[]) {
char *keywords[13] = {"void","main","if","then","break","int", "char","float","include","for","while","printf","scanf"}; //关键字 number=0; status=0; j=0;
ch=program[i++]; //遍历
if ((ch >= 'a') && (ch <= 'z' )) //字母 {
while ((ch >= 'a') && (ch <= 'z' )) {
words[j++]=ch; ch=program[i++]; } i--;
words[j++] = '\0'; for (k = 0; k < 13; k++)
if (strcmp (words,keywords[k]) == 0) //判断是否为关键字 switch(k) { case 0:{ flag = 1; status = 1; break; } case 1:{ flag = 2; status = 1; break; } case 2:{ flag = 3; status = 1; break; } case 3:{ flag = 4; status = 1;
break; } case 4:{ flag = 5; status = 1; break; } case 5:{ flag = 6; status = 1; break; } case 6:{ flag = 7; status = 1; break; } case 7:{ flag = 8; status = 1; break; } case 8:{ flag = 9; status = 1; break; } case 9:{ flag = 10; status = 1; break; } case 10:{ flag = 11; status = 1; break; } case 11:{ flag = 12; status = 1; break; } case 12:{ flag = 13;
status = 1; break; } }
if (status == 0) {
flag = 100; //标识符() } }
else if ((ch >= '0') && (ch <= '9')) //数字() {
number = 0;
while ((ch >= '0' ) && (ch <= '9' )) {
number = number*10+(ch-'0'); ch = program[i++]; }
flag = 200; i--; }
else switch (ch) //运算符和标点符号 {
case '=':{ if (ch == '=') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0'; flag = 401; } else { i--; flag = 402; } break; }
case'>':{
if (ch == '>') words[j++] = ch;
words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0'; flag = 403; } else { i--; flag = 404; } break; }
case'<':{ if (ch == '<') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0'; flag = 405; } else { i--; flag = 406; } break; }
case'!':{ if (ch == '!') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0';
} else { i--; flag = 408; } break; }
case'+':{ if (ch == '+') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0'; flag = 409; }
else if (ch == '+') {
words[j++] = ch; words[j] = '\0'; flag = 410; } else { i--; flag = 411; } break; }
case'-':{ if (ch == '-') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0';
}
else if( ch == '-') {
words[j++] = ch; words[j] = '\0'; flag = 413; } else { i--; flag = 414; } break; }
case'*':{ if (ch == '*') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0'; flag = 415; } else { i--; flag = 416; } break; }
case'/':{ if (ch == '/') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch; words[j] = '\0';
} else { i--; flag = 418; } break; }
case'^':{ words[j] = ch; words[j+1] = '\0'; flag = 419; break; }
case';':{ words[j] = ch; words[j+1] = '\0'; flag = 501; break; }
case'(':{ words[j] = ch; words[j+1] = '\0'; flag = 502; break; }
case')':{ words[j] = ch; words[j+1] = '\0'; flag = 503; break; }
case'[':{ words[j] = ch; words[j+1] = '\0'; flag = 504; break; }
case']':{ words[j] = ch; words[j+1] = '\0'; flag = 505; break; }
case'{':{ words[j] = ch; words[j+1] = '\0'; flag = 506; break; }
case'}':{ words[j] = ch; words[j+1] = '\0'; flag = 507; break; }
case':':{ words[j] = ch; words[j+1] = '\0'; flag = 508; break; }
case'"':{ words[j] = ch; words[j+1] = '\0'; flag = 509; break; }
case'%':{ if (ch == '%') words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=') {
words[j++] = ch;
words[j] = '\0'; flag = 510; } else { i--; flag = 511; } break; }
case',':{ words[j] = ch; words[j+1] = '\0'; flag = 512; break; }
case'#':{ words[j] = ch; words[j+1] = '\0'; flag = 513; break; }
case'@':{ words[j] = ch; words[j+1] = '\0'; flag = 514; break; }
case' '://空格 {
words[j] ='_'; words[j+1] = '\0'; flag = 515; break; }
case'$':{ words[j] = '#'; words[j+1] = '\0'; flag = 0; break;
正在阅读:
编译原理词法语法语义分析器设计07-18
汽车照明与信号系统06-05
生命的顽强作文400字07-09
测试与检测技术基础(1基本概念)16206875ppt课件08-05
《间谍之桥》观后感04-02
关于XX同志函调材料的复函模板11-04
高中生抗击疫情作文2022年03-25
《我有一个梦想》学案02-28
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 词法
- 分析器
- 语义
- 编译
- 语法
- 原理
- 设计
- 【金版学案】2016届高三历史一轮复习习题:必修3第7单元第七单元 现代中国的科学技术与文化教育事业
- 战略管理考试重点总结
- 《财务管理》期末复习及计算题讲解
- 携程旅行网商务模式分析
- 2012-2013新人教版八年级物理(下)期中考试试题及答案
- 利用笔记本共享无线网络
- 配合学校搞好家庭教育是每位家长的责任
- 资阳2019部编人教版语文四年级上册-第9课《古诗三首-暮江吟-题西林壁-雪梅》-教案-说课稿-课堂实录
- 物理选修3-3教案-10.1功和内能
- 锐角三角函数测试
- 2010年高考英语备考研讨会
- 原码、反码、补码、移码的一些说明
- 当前我国宏观经济形势与财政政策取向
- 从苹果公司内控制度看苹果是怎样应对乔布斯的离任
- 辐射交联LDPE/EVA混合体系泡沫片材性能的研究
- 6S管理推行细则-终端管理
- 爱在烟花的感悟_评词人柳永对女性情感的特殊关怀
- 2011年全国计算机等级考试二级VFP考点汇总
- 基于J2EE架构的网络考试系统的设计与实现
- 嘉定区社会组织发展现状及对策研究-正文