下载此文档

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


文档分类:高等教育 | 页数:约24页 举报非法文档有奖
1/24
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/24 下载此文档
文档列表 文档介绍
该【编译原理实验报告——词法分析器和LL(1)文法 】是由【花双韵芝】上传分享,文档一共【24】页,该文档可以免费在线阅读,需要了解更多关于【编译原理实验报告——词法分析器和LL(1)文法 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。.《编译原理》综合性实验报告实验学期 2016 至 2017 学年 第1 学期专业 计算机科学与技术 班级 1403学生姓名 黄世增 学号 1411640305任课教师 赵曦实验成绩Word文档资料.《编译原理》课程综合性实验报告开课实验室:C210 2016 年12 月6日实验题目 词法分析器的设计一、实验目的通过设计、编制、调试一个具体的词法分析程序,实现对高级程序设计语言源程序进行扫描, 并将其分解为各种单词的词法分析方法; 加深对课堂教学的理解;提高词法分析方法的实践能力。二、实验要求任选一种高级程序设计语言编程完成词法分析器。词法分析器应以教材所述分词原理为依据,使用恰当的数据结构和方法,结构清晰、高效。编制一个读单词过程,源程序保存在文本文件中(也可键盘输入),读取该文件,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分界符五大类。依次输出各个单词的内部单词种别及单词符号自身值, 遇到错误时可显示“Eorror”,然后跳过错误部分继续显示。二、:PC机Pentium100以上。:Win10,VS2010。三、<关键字>->int|for|while|do|return|break|continue<运算符和界符>->|+|-|*|/|==|<|<=|!=|>|>=|,|;|(|)|{|}<标识符>->letter(letter|digit)*<整型常数>->digitdigit*,其基本思想是根据扫描到单词符号的第一个字符的种类,拼接出相应的单词符号。、运算符、界限符的置初值。:在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等。读取的字符送入word。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。 其他拼字符串 运算符、 符号界符等符号拼数是否关键字? 否是 (4/5,单词自身值) 报错(2,单词自身值)(1,单词自身值)(3,单词自身值)返回图2 扫描子程序四、,先定义几个全局变量, key[]事先存放 7个关键字,words[]用来存放识别出来的单词二元组, text 用来存放从文件读取的内容, word用于存放识别出来的单词,length 存放字符个数,k存放识别出来的单词个数。首先,将文本内容读取到 text 中,文本内容最后一个字符是空白符,然后调用scan方法,逐个扫描每个字符,如果 word的第一个字符是字母,则进行拼字符串,再判断是关键字还是标识符;如果 word的第一个字符是数字,则在 word清空之前判断是否有识别出非数字字符,若有,则出错,若没有,则识别出来的字符串是常数;若 word第一个字符是运算符或界限符,则各自存到 words[]中。最后扫描结束后输出。五、、实验小结和思考通过这次实验,我对词法分析器有了进一步的了解,而且对词法分析和语法分析在实践中的应用有了深入的掌握 , 让我对高级语言的学****有了更深的认识 ,了解得更透彻。七、源程序清单#include<>#include<>#include<string>using namespacestd;#define MAX10000struct WordString{stringWord; //单词int category; //类别};char*key[7]={"int","for","while","do","return","break","continue"};//关键字WordStringwords[MAX]; //创建一个单词符号串stringtext; //读入的文本存入 text 中stringword; //分割出的单词用 word表示int length; // k; //总单词个数voidscan(){int i,j;k=0;word="";for(i=0;i<=length-1;i++){if(word!=""){if(((word[0]>='A')&&(word[0]<='Z'))||((word[0]>='a')&&(word[0]<='z')))//首字符是字母{if(((text[i]>= 'A')&&(text[i]<= 'Z'))||((text[i]>= 'a')&&(text[i]<= 'z' ))||((text[i]>=48)&&(text[i]<=57))){word+=text[i];}else{words[k].Word=word;for(j=0;j<7;j++){if(words[k].Word==key[j]){words[k].category=1; //表示关键字break;}else if(j==6)words[k].category=2; //表示标识符}k++;word="";i--;}}elseif(word[0]==',' ||word[0]== ';' ||word[0]== '{' ||word[0]== '}' ||word[0]== '(' ||word[0]==')' )//首字符是界限符{words[k].Word=word;words[k].category=5; //++;word="";i--;}elseif(word[0]=='+'||word[0]== '-' ||word[0]== '*' ||word[0]== '/' ||word[0]== '='||word[0]=='>'||word[0]== '<'||word[0]== '!' )//首字符是运算符{if(text[i]== '='){word+=text[i];words[k].Word=word;words[k].category=4; //表示运算符k++;word="";}else{words[k].Word=word;words[k].category=4; //表示运算符k++;word="";i--;}}else if(word[0]>=48&&word[0]<=57) //首字符是数字{if(text[i]>=48&&text[i]<=57){word+=text[i];}elseif((text[i]>= 'A'&&text[i]<= 'Z')||(text[i]>= 'a'&&text[i]<= 'z')){word+=text[i];words[k].category=6; //表示出错,标识符以数字开头}else{words[k].Word=word;if(words[k].category!=6)words[k].category=3; //表示常数k++;word="";--;}}}else{if(text[i]!=10&&text[i]!=32&&text[i]!=9){word+=text[i];}}}}int main(){FILE*fp; //文件指针fp=fopen( "" ,"r"); //打开文件if(fp==NULL){printf( "Can'topenthisfile!\n" );exit(0);}int i=0;while(!feof(fp)) //判断是否到文件结尾{text+=fgetc(fp);i++;}length=i; //text 最后一个字符是空字符fclose(fp); //关闭文件scan();for(i=0;i<k;i++) //输出{if(words[i].category==6)printf( "%sEorror\n" ,words[i].());elseprintf( "(%d,%s)\n" ,words[i].category,words[i].());}getchar();return 0;}:C2102016年12月8日实验题目语法分析——LL(1)语法分析方法的实现Word文档资料

编译原理实验报告——词法分析器和LL(1)文法 来自淘豆网www.taodocs.com转载请标明出处.