版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验编译程序实验学校:云农业大学班级:14计科班姓名:YZJ学号:XXXXXXXXXX实验目的:用C语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。C.1词法分析C.1.1实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。C.1.2实验要求C.1.2.1待分析的简单语言的词法(1)关键字:begin if then while do end所有关键字都是小写。(2)运算符和界符::= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和
2、整型常数(NUM),通过以下正规式定义:ID=letter(letter|digit)*NUM= digit digit*(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。C.1.2.2各种单词符号对应的种别码 表C.1 各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17if2:=18then3<20while4<>21do5<=22end6>23letter(letter|digit)10>=24digit digit11=25+13;26-14(27*15)28/16#0
3、C.1.2.3 词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序 begin x:=9; if x>0 then x:=2*x+1/3; end#的源文件,经词法分析后输出如下序列: (1,begin)(10,'x')(18,:=)(11,9)(26,;)(2,if).C.1.3词法分析程序的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应
4、的单词符号。1.主程序示意图主程序示意图如图C.1所示。其中初值包括如下两个方面:(1)关键字表的初值。关键字作为特殊标符识处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:char * rwtab6="begin","if","then","while","do","end"图 C.1 词法分析主程序示意图(2)程序中需要用到的主要变量为syn
5、,token和sum。2.扫描子程序的算法思想首先设置3个变量:token用来存放构成单词符号的字符串;sum用来存放整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图C.2所示。C.1.4词法分析程序的C语言程序框架# include <stdio.h> /*定义I/O库所用的某些宏和变量*/# include <string.h> /*定义字符串库函数*/char prog80,token8;char ch;int syn,p,m,n,sum; /*p是缓冲区prog的指针,m是token的指针*/ char *rwtab6="begin
6、","if","then","while","do","end"图C.2 词法分析程序流程main() p=0;printf("n please input string:n"):do输入源程序字符串,送到缓冲区progp+中; while(ch!='#');p=0;do scaner();switch(syn) case 11:输出(数的二元组);break;case -1:输出(错误);break;default:输出(其他单词二元组);whil
7、e(syn!=0);词法扫描程序:scaner() m=0;for (n=0;n<8;n+) tokenn=NULL;读下一个字符;while(ch=' ') 读下一个字符;if(ch是字母字符) while(ch为字母字符或数字字符) chtoken;读下一个字符;tokenm+='0' 回退一个字符; syn=10;for(n=0;n<6;.) if (strcmp(token,rwtabn)=0) 给出syn值;break;elseif(ch是数字字符) while(ch为数字字符) sum=sum*10+ch-'0'读下一个字
8、符;回退一个字符; syn=11;elseswitch(ch) case'<': m=0; tokenm+=ch;读下一个字符;if(ch='>') syn=21:tokenm+=ch;else if(ch='=') syn=22;tokenm+=ch;elsesyn=20; 回退一个字符;break;case'>': chtoken;读下一个字符;if(ch='=') 将>=的种别码syn;chtoken;else 将>的种别码syn;回退一个字符;break;case':&
9、#39;: chtoken;读下一个字符;if(ch='=') 将:=的种别码syn;chtoken;else ( 将:的种别码syn;回退一个字符;break;case'+': syn=13; token0=ch;break;case'-': syn=14; token0=ch;break;case'*': syn=15; token0=ch;break;case'/': syn=16; token0=ch;break;.case'#': syn=0; token0=ch;break;defaul
10、t:syn=-1;c.2 语法分析c.2.1实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。c.2.2实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。c.2.2.1待分析的简单语言的语法用扩充的BNF表示如下:(1)<程序>:=begin<语句串>end(2)<语句串>:=<语句><语句>(3)<语句>:=<赋值语句>(4)<赋值语句>:=ID:=<表达式>(5)<表达式>:=:项+<项>|-<项&
11、gt;(6)<项>:=<因子>*<因子>|/<因子>(7)<因子>:=ID|NUM|(<表达式>)c.2.2.2实验要求说明输入单词串,以"#"结束,如果是文法正确的句子,则输出成功信息,打印"success",否则输出"error"。例如:输入 begin a:=9;x:=2*3;b:=a+x end# 输出 success 输入 x:=a+b*c end# 输出 error图C.3 语法分析主程序示意图C.2.3语法分析程序的算法思想(1)主程序示意图如图C.
12、3所示。(2)递归下降分析程序示意图如图C.4所示。(3)语句串分析过程示意图如图C.5所示。(4)statement语句分析函数流程如图C.6图、C.7图、C.8图、C.9所示。 图C.4 递归下降分析程序示意图 图C.5 语句串分析示意图 图C.6 statement语句分析函数示意图 图C.7 expression表达式分析函数示意图 图C.8 term 分析函数示意图 图C.9 factor分析过程示意c.2.4语法分析程序的C语言程序框架1rparser() if (syn=1) 读下一个单词符号;调用yucu函数;if(syn=6) 读下一个单词符号;if(syn=0&&a
13、mp;(kk=0)输出("success");else if(kk!=1) 输出 '缺 end'错误; kk=1; else 输出'begin'错误;kk=1; return;yucu() 调用statement();while(syn=26) 读下一个单词符号;调用statement函数;return;statement() if(syn=10) 读下一个单词符号;if(syn=18) 读下一个单词符号;调用statement函数;else输出赋值号错误;kk=1;else输出语句错误;kk=1return;expression()调用te
14、rm函数;while(syn=13or14) 读下一个单词符号;调用term函数; return;term()调用factor函数; while(syn=15 or 16) 读下一个单词符号;调用factor函数;returnfactor() if(syn=10 or 11)读下一个单词符号;else if(syn=27) 读下一个单词符号;调用expression函数;if (syn=28)读下一个单词符号;else输出''错误; kk=1;else输出表达式错误; kk=1;return;实验源码/词法分析器源码# include <stdio.h> /*定义I
15、/O库所用的某些宏和变量*/# include <string.h> /*定义字符串库函数*/#include<stdlib.h>char prog80, token8;char ch;int syn, p, m, n; /*p是缓冲区prog的指针,m是token的指针*/char *rwtab6 = "begin","if","then","while","do","end" ;double sum;void scaner();main()p =
16、0;printf("please input string:n");doch = getchar();progp+ = ch; while (ch != '#');p = 0;doscaner();switch (syn)case 11:printf("(%d,%s)n", syn, sum); break;case -1:printf("errorn"); break;default:printf("(%d,%s)n", syn, token); while (syn != 0);system(&
17、quot;pause");void scaner()m = 0;for (n = 0; n < 8; n+) tokenn = NULL;ch = progp+;while (ch = ' ')ch = progp+;if (ch >= 'a'&&ch <= 'z') | (ch >= 'A'&&ch <= 'Z')/如果ch是字母字符m = 0;while (ch >= 'a'&&ch <=
18、9;z') | (ch >= 'A'&&ch <= 'Z') | (ch >= '0'&&ch <= '9')/如果ch是字母字符或数字字符tokenm+ = ch;ch = progp+;/读下一个字符tokenm+ = '0'p-;syn = 10;for (n = 0; n < 6; n+)if (strcmp(token, rwtabn) = 0)syn = n + 1;/给出syn值break;elseif (ch >= '
19、;0'&&ch <= '9')sum = 0;while (ch >= '0'&&ch <= '9')sum = sum * 10 + ch - '0'ch = progp+;p-;syn = 11;elseswitch (ch)case'<':m = 0;tokenm+ = ch;ch = progp+;if (ch = '>') syn = 21;tokenm+ = ch;else if (ch = '=')
20、syn = 22;tokenm+ = ch;elsesyn = 20;p-;break;case'>':m = 0;tokenm+ = ch;ch = progp+;if (ch = '=')syn = 24;tokenm+ = ch;elsesyn = 23;p-;break;case':':m = 0;tokenm+ = ch;ch = progp+;if (ch = '=')syn = 18;tokenm+ = ch;elsesyn = 17;p-;break;case'+': syn = 13; to
21、ken0 = ch; break;case'-': syn = 14; token0 = ch; break;case'*': syn = 15; token0 = ch; break;case'/': syn = 16; token0 = ch; break;case '=': syn = 25; token0 = ch; break;case '': syn = 26; token0 = ch; break;case '(': syn = 27; token0 = ch; break;case
22、')': syn = 28; token0 = ch; break;case'#': syn = 0; token0 = ch; break;default:syn = -1;/语法分析器/语法分析器# include <stdio.h> /*定义I/O库所用的某些宏和变量*/# include <string.h> /*定义字符串库函数*/#include<stdlib.h>char prog80, token8;char ch;int syn, p, m, n, kk; /*p是缓冲区prog的指针,m是token的指针*
23、/char *rwtab6 = "begin","if","then","while","do","end" ;double sum;void scaner()m = 0;for (n = 0; n < 8; n+)tokenn = NULL;ch = progp+;while (ch = ' ')ch = progp+;if (ch >= 'a'&&ch <= 'z') | (ch >=
24、 'A'&&ch <= 'Z')/如果ch是字母字符m = 0;while (ch >= 'a'&&ch <= 'z') | (ch >= 'A'&&ch <= 'Z') | (ch >= '0'&&ch <= '9')/如果ch是字母字符或数字字符tokenm+ = ch;ch = progp+;/读下一个字符tokenm+ = '0'p-;sy
25、n = 10;for (n = 0; n < 6; n+)if (strcmp(token, rwtabn) = 0)syn = n + 1;/给出syn值break;elseif (ch >= '0'&&ch <= '9')sum = 0;while (ch >= '0'&&ch <= '9')sum = sum * 10 + ch - '0'ch = progp+;p-;syn = 11;elseswitch (ch)case'<
26、9;:m = 0;tokenm+ = ch;ch = progp+;if (ch = '>') syn = 21;tokenm+ = ch;else if (ch = '=') syn = 22;tokenm+ = ch;elsesyn = 20;p-;break;case'>':m = 0;tokenm+ = ch;ch = progp+;if (ch = '=')syn = 24;tokenm+ = ch;elsesyn = 23;p-;break;case':':m = 0;tokenm+ = c
27、h;ch = progp+;if (ch = '=')syn = 18;tokenm+ = ch;elsesyn = 17;p-;break;case'+': syn = 13; token0 = ch; break;case'-': syn = 14; token0 = ch; break;case'*': syn = 15; token0 = ch; break;case'/': syn = 16; token0 = ch; break;case '=': syn = 25; token0 =
28、ch; break;case '': syn = 26; token0 = ch; break;case '(': syn = 27; token0 = ch; break;case ')': syn = 28; token0 = ch; break;case'#': syn = 0; token0 = ch; break;default:syn = -1;void lrparser()if (syn = 1)scaner(); /*读下一个单词符号*/yucu();if (syn = 6)scaner();if (syn = 0 &am
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 音乐作品版权授权合同
- 电梯托管服务合同
- 个人所得税扣缴申报表
- 幼儿园“立足岗位守初心 履职尽责显担当”做贡献活动方案
- 模压成型工班组管理测试考核试卷含答案
- 珂罗版印刷员道德竞赛考核试卷含答案
- 压铸模具工岗前工作实操考核试卷含答案
- 铁氧体材料烧成工岗位应急处理水平考核试卷含答案
- 医疗临床辅助服务员风险评估竞赛考核试卷含答案
- 手工平毯工进阶能力考核试卷含答案
- 2026-2027学年江苏省常州市度七年级数学上学期期中考试试题(含答案)
- GB/Z 181.1-2026液压传动元件的再制造第1部分:通用技术规范
- 2026年驾照补考科目一考试题库及答案
- 村干部笔试题库及答案
- 2026-2030中国他汀类行业市场发展趋势与前景展望战略研究报告
- 2026年度医师定期考核【执业-7】
- 2026年国企纪检监察岗位面试题含答案
- (2025版)《宿迁市养犬管理条例》学习与解读
- (正式版)DB42∕T 489-2026 《预应力混凝土管桩及空心方桩技术规程》
- 2026年海南省公开遴选公务员综合能力测试笔试题及答案
- 26年养老诈骗防范法规宣讲课件
评论
0/150
提交评论