收藏 分享(赏)

编译原理实验报告——词法分析器和LL(1)文法.doc

上传人:精品资料 文档编号:10432358 上传时间:2019-11-11 格式:DOC 页数:17 大小:230.73KB
下载 相关 举报
编译原理实验报告——词法分析器和LL(1)文法.doc_第1页
第1页 / 共17页
编译原理实验报告——词法分析器和LL(1)文法.doc_第2页
第2页 / 共17页
编译原理实验报告——词法分析器和LL(1)文法.doc_第3页
第3页 / 共17页
编译原理实验报告——词法分析器和LL(1)文法.doc_第4页
第4页 / 共17页
编译原理实验报告——词法分析器和LL(1)文法.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

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

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

3、 (letter | digit)*- digit digit*2算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼接出相应的单词符号。2.1 主程序3否是图 1 词法分析主程序示意图其中初始包括关键字、运算符、界限符的置初值。 2.2 扫描子程序的算法思想:在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等。读取的字符送入 word。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。置初值调用扫描子程序将结果存入结构体输入串结束结束输出

4、单词二元组4是 是否字母数字 其他运算符、 符号界符等符号否是图 2 扫描子程序四、实验步骤编写程序时,先定义几个全局变量,key事先存放 7 个关键字,words用来存放识别出来的单词二元组,text 用来存放从文件读取的内容,word 用于存放识别出来的单词,length 存放字符个数,k 存放识别出来的单词个数。首先,将文本内容读取到 text 中,文本内容最后一个字符是空白符,然后调用 scan 方法,逐个扫描每个字符,如果 word 的第一个字符是字母,则进行拼字符串,再判断是关键字还是标识符;如果 word 的第一个字符是数字,则在word 清空之前判断是否有识别出非数字字符,若有

5、,则出错,若没有,则识别出忽略空格text 是否扫描结束 返回拼数返回(4/5,单词自身值) 报错拼字符串是否关键字?(1,单词自身值)(2,单词自身值)(3,单词自身值)5来的字符串是常数;若 word 第一个字符是运算符或界限符,则各自存到 words中。最后扫描结束后输出。五、实验结果及分析六、实验小结和思考通过这次实验,我对词法分析器有了进一步的了解,而且对词法分析和语法分析在实践中的应用有了深入的掌握, 让我对高级语言的学习有了更深的认识 ,了解得更透彻。七、源程序清单6#include#include#includeusing namespace std;#define MAX 1

6、0000struct WordStringstring Word;/单词int category;/类别;char *key7 = “int“,“for“, “while“, “do“, “return“, “break“, “continue“;/关键字WordString wordsMAX; /创建一个单词符号串string text; /读入的文本存入 text 中string word; /分割出的单词用 word 表示int length; /字符个数int k; /总单词个数void scan()int i,j;k=0;word=“;for(i=0;i=A)/表示 LL(1)分析表

7、内容int main()char ch10=#,E; /用于存放符号栈内容char str10; /存放输入串13char str110; /用于存放最初输入的字符串char cha; /分析字符int i,j,m,n; /j:终结符所代表数字;m:非终结符所代表数字;n:产生式右部大小int l=1; /符号栈大小int k=1; /分析输入串的第几个字符int how; /利用哪个产生式int step=1; /步骤int length=0;printf(“请输入一串字符串,以#结尾:“ );doscanf(“%c“,strlength=cha;str1length=cha;length+

8、;while(cha!=#);printf(“步骤t 符号 栈tt 输入串tt 所用产生式n“);docha=str1k-1;printf(“%dt“,step);for(i=0;iTEn“);n=3;l=l+n-1;chl=T;chl-1=39;chl-2=E;step=step+1;else if(how=2)printf(“E-+TEn“);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“);l=l-2;step=step+1;else if(how=4)printf(“T

9、-FTn“);n=3;l=l+n-1;chl=F;chl-1=39;chl-2=T;step=step+1;else if(how=5)printf(“T-*FTn“);16n=4;l=l+n-2;chl=*;chl-1=F;chl-2=39;chl-3=T;step=step+1;else if(how=6)printf(“T-?n“);l=l-2;step=step+1;else if(how=7)printf(“F-(E)n“);n=3;l=l+n-1;chl=(;chl-1=E;chl-2=);step=step+1;else if(how=8)printf(“F-in“);n=1;l=l+n-1;chl=i;step=step+1;elseprintf(“错误!n“);break;elseif(cha=# break;17elseprintf(“n“);l=l-1;k=k+1;step=step+1;elseprintf(“错洙?误 !“);break;else /错误的字符printf(“错误的字符!“ );break;while(l=0);getch();return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报