编译原理实验报告——词法分析器和LL(1)文法资料(共17页)_第1页
编译原理实验报告——词法分析器和LL(1)文法资料(共17页)_第2页
编译原理实验报告——词法分析器和LL(1)文法资料(共17页)_第3页
编译原理实验报告——词法分析器和LL(1)文法资料(共17页)_第4页
编译原理实验报告——词法分析器和LL(1)文法资料(共17页)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上编译原理综合性实 验 报 告 实验学期 2016 至 2017 学年 第 1 学期专业 计算机科学与技术 班级 1403 学生姓名 黄世增 学号 任课教师 赵曦 实验成绩 编译原理课程综合性实验报告开课实验室:C210 2016年 12月 6日实验题目 词法分析器的设计一、实验目的通过设计、编制、调试一个具体的词法分析程序,实现对高级程序设计语言源程序进行扫描, 并将其分解为各种单词的词法分析方法;加深对课堂教学的理解;提高词法分析方法的实践能力。二、实验要求任选一种高级程序设计语言编程完成词法分析器。词法分析器应以教材所述分词原理为依据,使用恰当的数据结构和方法,结

2、构清晰、高效。编制一个读单词过程,源程序保存在文本文件中(也可键盘输入),读取该文件,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分界符五大类。依次输出各个单词的内部单词种别及单词符号自身值,遇到错误时可显示“Eorror”,然后跳过错误部分继续显示。二、实验设备与环境1硬件:PC机Pentium100以上。2软件:Win10,VS2010。三、实验内容1正规文法<关键字>-> int |for| while | do | return | break | continue<运算符和界符>-> |+ | - | * | / |=| <

3、 | <= |!= | > | >= | , | ; | ( | ) | |<标识符>-> letter (letter | digit)*<整型常数>-> digit digit*2算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼接出相应的单词符号。2.1 主程序置初值调用扫描子程序将结果存入结构体输入串结束 否 是 输出单词二元组 结束图1 词法分析主程序示意图其中初始包括关键字、运算符、界限符的置初值。 2.2 扫描子程序的算法思想:在词法分析中,先以只读

4、方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等。读取的字符送入word。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。忽略空格text是否扫描结束 返回 是 是否字母拼字符串 数字 其他运算符、 符号界符等符号是否关键字?返回拼数 否(4/5,单词自身值)报错(2,单词自身值) 是(1,单词自身值)(3,单词自身值)图 2 扫描子程序四、实验步骤编写程序时,先定义几个全局变量,key事先存放7个关键字,words用来存放识别出来的单词二元组,text用来存放从文件读取的内容,word用于存放识别出来的单词,length存放字符个

5、数,k存放识别出来的单词个数。首先,将文本内容读取到text中,文本内容最后一个字符是空白符,然后调用scan方法,逐个扫描每个字符,如果word的第一个字符是字母,则进行拼字符串,再判断是关键字还是标识符;如果word的第一个字符是数字,则在word清空之前判断是否有识别出非数字字符,若有,则出错,若没有,则识别出来的字符串是常数;若word第一个字符是运算符或界限符,则各自存到words中。最后扫描结束后输出。五、实验结果及分析六、实验小结和思考通过这次实验,我对词法分析器有了进一步的了解,而且对词法分析和语法分析在实践中的应用有了深入的掌握, 让我对高级语言的学习有了更深的认识 ,了解得

6、更透彻。七、源程序清单#include<stdio.h>#include<stdlib.h>#include<string>using namespace std;#define MAX 10000 struct WordString string Word;/单词 int category;/类别 ; char *key7 = "int","for", "while", "do", "return", "break", "con

7、tinue"/关键字 WordString wordsMAX; /创建一个单词符号串 string text; /读入的文本存入text中 string word; /分割出的单词用word表示 int length; /字符个数 int k; /总单词个数 void scan() int i,j; k=0; word="" for(i=0;i<=length-1;i+) if(word!="") if(word0>='A')&&(word0<='Z')|(word0>=&

8、#39;a')&&(word0<='z')/首字符是字母 if(texti>='A')&&(texti<='Z')|(texti>='a')&&(texti<='z')|(texti>=48)&&(texti<=57) word+=texti; else wordsk.Word=word;for(j=0;j<7;j+)if(wordsk.Word=keyj)wordsk.category=1;/表

9、示关键字break;else if(j=6)wordsk.category=2;/表示标识符k+;word=""i-; else if(word0=','|word0=''|word0=''|word0=''|word0='('|word0=')')/首字符是界限符 wordsk.Word=word; wordsk.category=5;/表示界限符 k+; word="" i-; else if(word0='+'|word0='-&

10、#39;|word0='*'|word0='/'|word0='='|word0='>'|word0='<'|word0='!')/首字符是运算符 if(texti='=') word+=texti;wordsk.Word=word;wordsk.category=4;/表示运算符k+;word="" else wordsk.Word=word; wordsk.category=4;/表示运算符 k+; word="" i-; el

11、se if(word0>=48&&word0<=57)/首字符是数字 if(texti>=48&&texti<=57) word+=texti; else if(texti>='A'&&texti<='Z')|(texti>='a'&&texti<='z') word+=texti; wordsk.category=6;/表示出错,标识符以数字开头 else wordsk.Word=word; if(wordsk.cat

12、egory!=6) wordsk.category=3;/表示常数 k+; word="" i-; elseif(texti!=10&&texti!=32&&texti!=9)word+=texti; int main() FILE *fp; /文件指针 fp=fopen("text.txt","r"); /打开文件 if(fp=NULL) printf("Can't open this file!n"); exit(0); int i=0; while(!feof(fp)

13、/判断是否到文件结尾 text+=fgetc(fp); i+; length=i;/text最后一个字符是空字符 fclose(fp); /关闭文件 scan(); for(i=0;i<k;i+) /输出 if(wordsi.category=6) printf("%s Eorrorn",wordsi.Word.c_str(); else printf("(%d, %s)n",wordsi.category,wordsi.Word.c_str(); getchar(); return 0;开课实验室:C210 2016年 12月 8日实验题目 语法

14、分析LL(1)语法分析方法的实现一、实验目的通过设计、开发一个高级语言的LL(1)语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容(包括自顶向下语法分析、First集、Follow集、Select集、判断LL(1)文法的方法、文法等价变换、LL(1)分析表的构造、对某一输入串的分析过程的理解,提高语法分析方法的实践能力。二、实验要求消除直接左递归前的文法       消除直接左递归后的等价文法 G E:EE+T       

15、                 GE: ETE     ET                          

16、60;       E+TE|     TT*F                                TFT     TF 

17、60;                                T*FT|     F(E)|i            &#

18、160;                F(E)|i根据文法建立LL(1)分析表,并对输入串i+i*i进行语法分析,判断其是否是合法的句子,给出句子的分析过程。具体要求如下:1、理解语法分析在编译程序中的作用;2、理解LL(1)语法分析方法对文法的要求(必须是LL(1)文法); 3、理解LL(1)分析器模型;4、熟练掌握文法变换方法(消除直接左递归和提取左公共因子)。5、熟练掌握Select集合的求解方法和LL(1)分析表的构造方法;二、实验设备

19、与环境1硬件:PC机Pentium100以上。2软件:Win10,VS2010。三、实验内容 给定一个上下文无关文法G,在LL(1)语法分析方法中,必须先求出Select集,通过Select集判断是否是LL(1)文法,若是,则构造预测分析表。求出预测分析表之后,键盘输入一个字符串,依据LL(1)分析表单步输出字符串的分析过程。四、实验步骤 输入字符串和初始符号栈符号栈大小大于等于0? N 待分析字符是否为合法字符? Y Y N栈顶字符是否为合法字符? Y N待分析字符是否和符号栈栈顶字符相等? N Y待分析字符和栈顶字符同时为“#”对照分析表判断采用产生式 Y 分析成功产生式右部为空? Y N

20、匹配分析字符分析下一个字符弹出栈顶符号,不压入栈弹出栈顶符号,产生式右部逆序入栈 N修改栈大小修改栈大小五、实验结果及分析六、实验小结和思考本实验加深了我对 LL(1)分析法的算法和思想的理解。七、源程序清单#include<string.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>/*1:E->TE' 2:E'->+TE' 3:E'->? 4:T->FT' 5:T'->*FT' 6:T'-

21、>? 7:F->(E) 8:F->i*/int ll156=1,0,0,1,0,0,0,2,0,0,3,3,4,0,0,4,0,0,0,6,5,0,6,6,8,0,0,7,0,0;/表示LL(1)分析表内容int main()char ch10='#','E' /用于存放符号栈内容char str10; /存放输入串char str110; /用于存放最初输入的字符串char cha; /分析字符int i,j,m,n; /j:终结符所代表数字;m:非终结符所代表数字;n:产生式右部大小int l=1; /符号栈大小int k=1; /分析输入

22、串的第几个字符int how; /利用哪个产生式int step=1; /步骤int length=0;printf("请输入一串字符串,以#结尾:");doscanf("%c",&cha);strlength=cha;str1length=cha;length+;while(cha!='#');printf("步骤t符号栈tt输入串tt所用产生式n");docha=str1k-1;printf("%dt",step);for(i=0;i<=l;i+)printf("%c&q

23、uot;,chi); /输出符号栈printf("tt");for(i=k-1;i<length;i+) printf("%c",stri);printf("tt");switch(cha)case 'i':j=0;break;case '+':j=1;break;case '*':j=2;break;case '(':j=3;break;case ')':j=4;break;case '#':j=5;break;defult:j=-

24、1;break;if(j!=-1) /正确的字符if(chl!=cha)if(chl!=39)switch(chl)case 'E':m=0;break;case 'T':m=2;break;case 'F':m=4;break;default:m=-1;break;elseswitch(chl-1)case 'E':m=1;break;case 'T':m=3;break;default:m=-1;break;if(m!=-1)if(chl!=cha)how=ll1mj;if(how=1)printf("E->TE'n");n=3;l=l+n-1;chl='T'chl-1=39;chl-2='E'step=step+1;else if(how=2)printf("E'->+TE'n");n=4;l=l+n-2;chl='+'chl-1='T'chl-2=39;chl-3='E'step=step+1;else if(how=3)printf("E'->?n"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论