版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 谈军训心得体会(33篇)
- 食品安全自检自查制度
- 中专自我总结范文3篇
- 西湖导游词600字(32篇)
- 山东省聊城市2024-2025学年高一上学期11月期中物理试题
- 江西省赣州市十八县二十四校2024-2025学年高三上学期期中考试英语试题(含解析)
- 世界的海陆气候与居民-2024年中考地理总复习易混易错题(原卷版)
- 语文教学论教案 第一章 语文课程的性质、理念及目标
- 个人分期还款协议范本
- 企业贷款担保格式
- 2024-2030年狂犬疫苗行业市场深度分析及发展策略研究报告
- 《基因指导蛋白质的合成》(第 1课时)教学设计
- 2024-2030年果蔬行业市场发展现状及竞争格局与投资战略研究报告
- 绵阳市高中2022级(2025届)高三第一次诊断性考试(一诊)语文试卷(含答案)
- 自然资源调查监测劳动和技能竞赛
- 2 0 2 4 年 7 月 国开专科《法理学》期末纸质考试 试题及答案
- 6.1 我对谁负责 谁对我负责 课件-2024-2025学年统编版道德与法治八年级上册
- 2023-2024学年天津市经开区国际学校八年级(上)期末物理试卷
- DB23T 3842-2024 一般化工企业安全生产标准化评定规范
- 期中模拟押题卷(1-3单元)(试题)-2024-2025学年苏教版数学六年级上册
- 环氧树脂项目可行性研究报告项目报告
评论
0/150
提交评论