1、13计科工编译原理实验报告模板课件院 系: 计算机科学学院 专业、年级: 13级计科(一)课程名称: 编译原理(A) 组 号: 18 学号姓名: 201321091048韩晗 学号姓名:201321091053吴珊珊学号姓名: 201321091055次珍 指导教师: 李航高 周凌云 2016 年6月 10 日组号: 18 实验类别:综合型组员学号姓名201321091048韩晗201321091053Wss201321091055次珍实验名称实验一:词法分析实验室205204实验目的或要求一.实验目的通过编写一个具体的词法分析程序,加深对词法分析原理的理解。掌握在对程序设计语言源程序进行扫描
2、过程中将其分解为各类单词的词法分析方法。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字(关键字)、标识符、常数、运算符、分隔符五大类。依次输出各个单词的内部编码及单词符号自身值。实验原理(算法流程)二.实验原理1.待分析的简单的词法(1)关键字: begin if then while do end所有的关键字都是小写。(2)运算符和界符: = + - * / = = = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格
3、有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略2.输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。三、结果分析:输入begin x:=9: if x9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2) 如图所示: 程序代码四.程序代码#include #include char prog80,token8,ch;i
4、nt syn,p,m,n,sum;char *rwtab6=begin,if,then,while,do,end; scaner();void scanner_example (FILE *fp);main() FILE *fp; fp=fopen(D:1.txt,r);/打开文件 scanner_example (fp); scaner(); void scanner_example (FILE *fp) do ch=fgetc (fp); progp+=ch; while (ch!=#);p=0;do scaner(); switch(syn) case 11:printf( %-10d%
5、5d )n,sum,syn); break; case -1:printf(you have input a wrong stringn); default: printf( %-10s%5d )n,token,syn); break; while(syn!=0); (写不完时,可另加附页。) sum=0; for(m=0;m8;m+)tokenm+=NULL; ch=progp+; m=0; while(ch= )|(ch=n)ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+;
6、p-; syn=10; for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0; ch=progp+; p-; syn=11; else switch(ch) case :tokenm+=ch; ch=progp+; if(ch=) syn=24; tokenm+=ch; else syn=23; p-; break; case +: tokenm+=ch; ch=progp+; if(ch=+) syn=17; tokenm+=ch; else syn=13; p-; break; case -:tokenm+=ch; ch=progp+; if(ch=-) s
7、yn=29; tokenm+=ch; else syn=14; p-; break; case !:ch=progp+; if(ch=) syn=21; tokenm+=ch; else syn=31; p-; break; case =:tokenm+=ch;ch=progp+; if(ch=) syn=25; tokenm+=ch; else syn=18; p-; break; case *: syn=15; tokenm+=ch; break; case /: syn=16; tokenm+=ch; break; case (: syn=27; tokenm+=ch; break; c
8、ase ): syn=28; tokenm+=ch; break; case : syn=5; tokenm+=ch; break; case : syn=6; tokenm+=ch; break; case ;: syn=26; tokenm+=ch; break; case : syn=30; tokenm+=ch; break; case #: syn=0; tokenm+=ch; break; case :syn=17; tokenm+=ch; break; default: syn=-1; break; tokenm+=0; 实验结果分析及心得体会通过这次实验掌握在对程序设计语言源程
9、序进行扫描过程中将其分解为各类单词的词法分析方法。发现了自己对程序逻辑设计的不足并进行了改进得到了提升。和同学配合越来越默契,更觉得团队配合的默契度对程序的编写起着重要的作用。词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。 组员分工韩晗:代码编写 次珍:程序检验,程序调试 吴珊珊:编写报告.程序调试成绩评定教师签名: 2016年6月 日组号: 18 实验类别:综合型组员学号姓名201321091048韩晗201321091053吴珊珊20132109
10、1055次珍实验名称实验二:语法分析实验室205实验目的或要求一.实验目的根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。注:也可以采用预测分析方法、算符优先分析方法来进行分析。具体参照课本上的说明,以下是递归下降分析法的介绍实验原理(算法流程)二.实验效果图1.主程序示意图2.递归下降分析程序示意图(写不完时,可另加附页。)程序界面(效果图)3. 语句串分析过程示意图4.statement语句分析函数示意图(写不完时,可另加附页。)5. expression表达式分析函数示意图6. term分析函数示意图7. factor
11、分析过程示意图三.实验结果一、 结果分析:在d:1.txt中输入 begin a:=9; x:=2*3; b:=a+x end # 后输出ok! 如图所示:程序代码#include stdio.h#include string.hchar prog100,token8,ch;char *rwtab6=begin,if,then,while,do,end;int syn,p,m,n,sum;int kk;factor(); /递归下降分析expression(); yucu();term();statement(); /语句串分析parser();scaner();void scanner_ex
12、ample (FILE *fp);main()p=kk=0; FILE *fp; fp=fopen(D:1.txt,r);/打开文件 scanner_example (fp); scaner(); parser();void scanner_example (FILE *fp) do ch=fgetc (fp); progp+=ch; while (ch!=#);p=0;parser() /1 if(syn=1) scaner(); /*读下一个单词符号*/ yucu(); /2 /*调用yucu()函数;*/ if (syn=6) /end scaner(); if (syn=0)&(kk=
13、0) printf(ok!n); (写不完时,可另加附页。)else if(kk!=1) printf(the string havent got a end!n); kk=1; else printf(havent got a begin!n); kk=1; return; /1yucu() /2 -段分析 statement(); /3 /*调用函数statement();*/while(syn=26) /; scaner(); /*读下一个单词符号*/ if(syn!=6) /end statement(); /*调用函数statement();*/ return; /2statemen
14、t() /3 -句子分析 if(syn=10) /letter scaner(); /*读下一个单词符号*/ if(syn=18) /:= scaner(); /*读下一个单词符号*/ expression(); /*调用函数expression();*/ else printf(the sing := is wrong!n); kk=1; else printf(wrong sentence!n); kk=1; return; /3expression() /4 句子内部运算 term(); while(syn=13)|(syn=14) /+ - scaner(); /*读下一个单词符号*/
15、 term(); /*调用函数term();*/ return; /4term() /5 factor();while(syn=15)|(syn=16) /* / scaner(); /*读下一个单词符号*/ factor(); /*调用函数factor(); */ return; /5factor() if(syn=10)|(syn=11) /(letter|digit) scaner(); else if(syn=27) scaner(); /*读下一个单词符号*/ expression(); /*调用函数expression();*/./ if(syn=28) scaner(); /*读
16、下一个单词符号*/ else printf(the error on (n); kk=1; else printf(the expression error!n);kk=1; return; /5 scaner() /6 词法分析 sum=0; for(m=0;m8;m+)tokenm+=NULL; m=0; ch=progp+; while(ch= )ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+; p-; syn=10; tokenm+=0; for(n=0;n=0)&(ch
17、=0)&(ch=9) sum=sum*10+ch-0; ch=progp+; p-; syn=11; else switch(ch) case ) syn=21; else if(ch=) syn=22; else syn=20; p-; break; case :m=0; ch=progp+; if(ch=) syn=24; else syn=23; p-; break; case :m=0; ch=progp+; if(ch=) syn=18; else syn=17; p-; break; case +: syn=13; break; case -: syn=14; break; cas
18、e *: syn=15;break; case /: syn=16;break;case (: syn=27;break; case ): syn=28;break; case =: syn=25;break; case ;: syn=26;break; case #: syn=0;break; case if: syn=2;break; case then: syn=3;break; case wile: syn=4;break; case do: syn=5;break; case end: syn=6;break; case :=: syn=18;break; case : syn=21
19、;break; case =: syn=24;break; default: syn=-1;break; 实验结果分析及心得体会 通过这次实验加深对递归下降分析法的理解。发现了自己对程序逻辑设计的不足并进行了改进得到了提升。和同学配合越来越默契,更觉得团队配合的默契度对程序的编写起着重要的作用。通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。因为首先对词法分析进行了编写,在遇到语法分析的时候更得心应手了。通过实验更加强了组员间的编程能力组员分工次珍:程序编写 程序调试 韩晗:程序编写程序调试 吴珊珊:程序调试 编写实验报告成绩评定教师签名: 2016年6月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1