版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学 生 实 验 报 告(理工类)课程名称: 编译原理 专业班级:10级计算机科学与技术(单)学生学号: 1005202006 学生姓名: 施鑫楠 所属院部: 信息技术学院 指导教师: 蔡 群 20 12 20 13 学年 第 2 学期金陵科技学院教务处制实验一:词法分析一、实验目的通过设计、开发一个高级语言的词法分析程序,加深对课堂教学内容(包括正规文法、正规表达式、有限自动机、nfa到dfa的转换、dfa的最小化)的理解,提高词法分析方法的实践能力。实验准备微机cpu主频1.3g以上,128m内存,安装好c语言,pascal语言,或c+。 实验时间 4学时 实验内容已给pl/0语言文法,输出
2、单词(关键字、专用符号以及其它标记)。二实验内容 1、格式输入:源程序文件。 输出:关键字、专用符号以及其它标记。 2、编译对象: 包含如下基本内容 1) 变量、说明语句及其它标记2) 赋值语句 3) 条件转移语句 4) 表达式(算术表达式和逻辑表达式) 5) 循环语句 6) 过程调用语句3、 实现过程(1) 关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:char *rwtab6 = “begin”, “if”,
3、“then”, “while”, “do”, “end”,;(2)程序中需要用到的主要变量为syn,token和sum首先设置3个变量:token用来存放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。pl/0语言的ebnf表示<常量定义>:=<标识符>=<无符号整数><标识符>:=<字母>=<字母>|<数字><加法运算符>:=+|-<乘法运算符>:=*|/<关系运算符>:=|#|<|<=|>|>=<字母>:=a|
4、b|x|y|z<数字>:=0|1|2|8|94、主体结构的说明在这里说明部分告诉我们使用的letter,digit, ident(标识符,通常定义为字母开头的字母数字串)和str(字符串常量,通常定义为双引号括起来的一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用#include来使用标准的头文件和前向说明(forward ,references).这些代码应该再标记"%"和"%"之间;规则部分>可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送id名称和字符串常量内容到主调函数和main函
5、数的功能.5、实现原理程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。三:设计过程1 关键字:void,main,if,then,break,int,char,float,include,for,while,printfscanf 并为小写。 2"+”;”-”;”*”;”/”;”:=“;”:”;”<“;”<=“;”>“;”>=“;”<>“;”=“;”(“;”)”;”;”;”#”为运算符。3 其他标记 如字符串,表示以字母开头的标识符。 4 空格符跳过。 5 各符号对应种别码 关键字
6、分别对应1-13运算符分别对应401-418,501-513。字符串对应100常量对应200结束符#四:举例说明输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序 begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件
7、,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)五:源程序:#include <stdio.h>#include <stdlib.h>#include <string.h>char prog100,ch,token8;int p=0,syn,n,i;char *keyword6="begin","then","if","while","do","end"void scaner()
8、;void irparse();void statement();void expression_r();void term();void factor(); void main()13 int select=-1; p=0; printf("please input sentence, end of '#' !n&
9、quot;); do ch=getchar(); progp+=ch;
10、0; while(ch!='#'); p=0; printf("请输入1 或 2 n 1.词法分析n 2.语法分析n");
11、 scanf("%d",&select); if(select=1) do
12、 scaner(); switch(syn)
13、0; case -1:printf("词
14、法分析 出错n");break; default :printf("<%d,%s>n",syn,token);break;
15、0; while(syn!=0); printf("词法分析 成功n");
16、0; else if(select=2) scaner(); if(syn=1)
17、; irparse();/begin else printf("语法分析出错! 请检查begin关键字n");return; if(syn=6)/
18、end scaner();
19、 if(syn=0)
20、60; printf("恭喜 语法分析 成功n");
21、60; else printf("语法分析出错! 请检查是否缺少'#'n");
22、 elseprintf("语法分析出错! 请检查是否缺少'end'n"); getchar(); void scaner()
23、160; for(n=0;n<8;n+) tokenn='0' n=0;
24、0; ch=progp+; while(ch=' ')ch=progp+;
25、;if(ch>='a'&&ch<='z')|(ch>='a'&&ch<='z')
26、160; do tokenn+=ch; &
27、#160; ch=progp+; while(ch>='a'&&ch<='z')|(ch>='a'&&ch<='z')|(ch>=
28、'0'&&ch<='9'); syn=10;
29、 for(n=0;n<6;n+) if(strcmp(token,keywordn)=0)
30、160; syn=n+1;
31、
32、 p-;
33、60; /return; else if(ch>='0'&&ch<='9')
34、 p-;
35、60; do &
36、#160; tokenn+=progp+; ch=progp; &
37、#160; while(ch>='0'&&ch<='9'); syn=11;
38、
39、return; else &
40、#160; /ch=progp+;
41、160; switch(ch)
42、0; case '+':syn=13;token0=ch;break; case '-':syn=14;token0=ch;break;
43、160; case '*':syn=15;token0=ch;break; case '/':syn=16;token0=ch;break;
44、 case ':':syn=17;token0=ch;
45、160; ch=progp+; if(ch='=')token1=ch;syn+; &
46、#160; else p-;
47、; break; case '<':syn=20;token0=ch;
48、0; ch=progp+;
49、 if(ch='>')token1=ch;syn+;
50、 else if(ch='=')token1=ch;syn=syn+2; else p-;
51、60; break;
52、60; case '>':syn=23;token0=ch; ch=progp+;
53、0; if(ch='=')token1=ch;syn+; &
54、#160; else p-;
55、; break; case '=':syn=25;token0=ch;break; &
56、#160; case '':syn=26;token0=ch;break; case '(':syn=27;token0=ch;break;
57、 case ')':syn=28;token0=ch;break; case '#':syn=0;token0=ch;break;
58、; default: printf("词法分析出错! 请检查是否输入非法字符n");syn=-1;break;
59、60;
60、60; /return; void irparse()
61、;scaner(); statement(); while(syn=26)/;
62、; scaner(); statement(); vo
63、id statement() if(syn=10) scaner(); if(syn=18)
64、; scaner();
65、160; expression_r(); else &
66、#160; printf("语法分析出错! 请检查表达式是否正确n");return;
67、60; else printf("语法分析出错! 请检查语句是否正确n");return; void exp
68、ression_r() term(); while(syn=13|syn=14)/+ - scaner();
69、60; term(); void term() factor(); while(syn=15|syn=16)/* /
70、 scaner(); factor(); void factor() if(syn=10|syn=11)
71、 scaner(); else if(syn=27)
72、 scaner(); expression_r(); if(syn=28)
73、160; scaner();
74、; else printf("语法分析出错! 请检查是否缺少')'n");return; else printf("语法分析出错! 请检查是否输入非法字符n");return; printf("(%2d,%4d)",flag,number); else if (flag = -1) printf(&qu
75、ot;(%d,error)",flag); else printf("(%2d,%4s)",flag,words); while (flag != 0); system("pause");实验二:语法分析一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。二、实验准备微机cpu主频1.3g以上,128m内存,安装好c语言,pascal语言,或c+。三、实验时间 6学时四、实验内容 已给pl/0语言文法,利用递归子程序法,编制语法分析程序,要求将错误信息输出到语法错误文件中,输出语法树。 五、
76、实验要求利用c语言编制递归下降分析程序,并对简单语言进行语法分析。 5.1 待分析的简单语言的语法用扩充的bnf表示如下:1)<程序>:=begin<语句串>end2)<语句串>:=<语句>;<语句>3)<语句>:=<赋值语句>4)<赋值语句>:=id:=<表达式>5)<表达式>:=<项>+<项> | -<项>6)<项>:=<因子>*<因子> | /<因子>7)<因子>:
77、=id | num | (<表达式>) 5.2 实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如: 输入 begin a:=9; x:=2*3; b:=a+x end # 输出 语法分析成功 输入 x:=a+b*c end # 输出
78、160;语法分析5.3 语法分析程序的酸法思想1)主程序示意图如图所示。2)递归下降分析程序示意图如图所示。3)语句串分析过程示意图如图所示。程序源代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char prog100,ch,token8;int p=0,syn,n,i;char *keyword6="begin","then","if","while","do","end&qu
79、ot;void scaner();void irparse();void statement();void expression_r();void term();void factor(); void main() int select=-1; p=0; printf("please input sentence, en
80、d of '#' !n"); do ch=getchar(); progp+
81、=ch; while(ch!='#'); p=0; printf("请输入1 或 2 n 1.词法分析n 2.语法分析n");
82、160; scanf("%d",&select); if(select=1) do
83、160; scaner(); switch(syn)
84、 case -1:prin
85、tf("词法分析 出错n");break; default :printf("<%d,%s>n",syn,token);break;
86、; while(syn!=0); printf("词法分析 成功n");
87、0; else if(select=2) scaner(); if(syn=1)
88、; irparse();/begin else printf("语法分析出错! 请检查begin关键字n");return; if(syn=6)/end
89、160; scaner();
90、; if(syn=0)
91、160; printf("恭喜 语法分析 成功n");
92、 else printf("语法分析出错! 请检查是否缺少'#'n");
93、160; elseprintf("语法分析出错! 请检查是否缺少'end'n"); getchar(); void scaner()
94、60; for(n=0;n<8;n+) tokenn='0' n=0; ch=progp+;&
95、#160; while(ch=' ')ch=progp+; if(ch>='a'&am
96、p;&ch<='z')|(ch>='a'&&ch<='z') do &
97、#160; tokenn+=ch;
98、160; ch=progp+; while(ch>='a'&&ch<='z')|(ch>='a'&&ch<='z')|(ch>='0'&&ch&l
99、t;='9'); syn=10; &
100、#160; for(n=0;n<6;n+) if(strcmp(token,keywordn)=0)
101、60; syn=n+1; &
102、#160; &
103、#160; p-;
104、0; /return; else if(ch>='0'&&ch<='9') &
105、#160; p-;
106、0; do
107、160;tokenn+=progp+; ch=progp;
108、160; while(ch>='0'&&ch<='9'); syn=11; &
109、#160; return;
110、 else
111、160; /ch=progp+;
112、60; switch(ch) case '+':
113、syn=13;token0=ch;break; case '-':syn=14;token0=ch;break;
114、60; case '*':syn=15;token0=ch;break; case '/':syn=16;token0=ch;break; &
115、#160; case ':':syn=17;token0=ch; ch=progp+
116、; if(ch='=')token1=ch;syn+;
117、160; else p-;
118、 break; case '<':syn=20;token0=ch;
119、; ch=progp+; &
120、#160; if(ch='>')token1=ch;syn+; e
121、lse if(ch='=')token1=ch;syn=syn+2; else p-;
122、0; break;
123、0;case '>':syn=23;token0=ch; ch=progp+;
124、; if(ch='=')token1=ch;syn+;
125、160; else p-;
126、 break; case '=':syn=25;token0=ch;break;
127、160; case '':syn=26;token0=ch;break; case '(':syn=27;token0=ch;break; &
128、#160; case ')':syn=28;token0=ch;break; case '#':syn=0;token0=ch;break;
129、 default: printf("词法分析出错! 请检查是否输入非法字符n");syn=-1;break;
130、60;
131、60; /return; void irparse() scaner();
132、160; statement(); while(syn=26)/;
133、;scaner(); statement(); void statement()
134、0; if(syn=10) scaner(); if(syn=18)
135、; scaner();
136、160; expression_r(); else &
137、#160; printf("语法分析出错! 请检查表达式是否正确n");return;
138、160; else printf("语法分析出错! 请检查语句是否正确n");return; void expression_r()
139、 term(); while(syn=13|syn=14)/+ - scaner();
140、160; term(); void term() factor(); while(syn=15|syn=16)/* /
141、; scaner(); factor(); void factor() if(syn=10|syn=11)
142、; scaner(); else if(syn=27) scane
143、r(); expression_r(); if(syn=28) &
144、#160; scaner(); else printf("语法分析出错! 请检查是否缺少')'n&q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险公司健康体检会诊制度分析
- 医疗行业客户反馈改进方案
- 三年级下册数学学案-简单的时间计算丨苏教版(精美pdf含答案)
- 二年级下册数学学案-3.1《轴对阵图形》|人教新课标
- 2016-2017沪科版九年级物理下册教案第18章 第2节 科学探究怎样产生感应电流
- 2024年劳动合同办理常见问题解答
- 2024年产品销售代理担保
- 2024年二手农产品买卖合同模板
- 幼儿园心理健康教育管理策略
- 2024年企业人力资源管理服务合同
- 5、风电吊装施工指导手册
- 10以内的分与合
- 浅析新能源电动汽车火灾调查方法
- 养老院健康体检表
- 高中英语选修一(人教版)2-2Learning About Language 教学课件
- 韵母教学讲解课件
- 《马立平中文》教学大纲
- 一年级美术大眼睛-完整版课件
- 浅谈我校啦啦操队存在的问题以及解决措施
- 广东省河源市各县区乡镇行政村村庄村名明细及行政区划代码
- 人教版选修《中国小说欣赏》课件:聊斋志异
评论
0/150
提交评论