版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南华大学计算机科学与技术学院实验报告(2023~2023学年度第二学期)课程名称编译原理实验名称词法分析器的设计与实现姓名学号专业班级地点教师实验目的及规定实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;可以采用一种编程语言实现简朴的词法分析程序;可以使用自己编写的分析程序对简朴的程序段进行词法分析。实验规定对单词的构词规则有明确的定义;编写的分析程序可以对的辨认源程序中的单词符号;辨认出的单词以<种别码,值>的形式保存在符号表中,对的设计和维护符号表;对于源程序中的词法错误,可以做出简朴的错误解决,给出简朴的错误提醒,保证顺利完毕整个源程序的词法分析;实验环节1.词法分析规则<标记符>::=<字母>|<标记符><字母>|<标记符><数字><常数>::=<数字>|<数字序列><数字><数字序列>::=<数字序列><数字>|<数字>|<.><字母>::=a|b|c|……|x|y|z<数字>::=0|1|2|3|4|5|6|7|8|9<运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符><算数运算符>::=+|-|*|/|...|--<关系运算符>::=<|>|!=|>=|<=|==<逻辑运算符>::=&&||||!<位运算符>::=&|||!<赋值运算符>::==|+=|-=|/=|*=<分界符>::=,|;|(|)|{|}|:|//|/**/<保存字>::=main|if|else|while|do|for|...|void2.单词符号的编码单词符号种别码单词符号种别码main0>26if1>=27else2<28while3<=29do4!30for5!=31switch6=32case7==33int8(34double9)35float10{36long11}37void12;38+13:39+=14|40++15||41-16数字42-=17标记符43--18,44&19//45&&20/**/46#21*22*=23/24/=253.状态转换图2字母非字母与数字1字母与数字0空白4数字非数字数字38/611+10=12!13=15其它3418<其它1719212字母非字母与数字1字母与数字0空白4数字非数字数字38/611+10=12!13=15其它3418<其它171921......&;,({},:)33其它2220=其它>1614+其它79*/=其它54.算法分析①词法分析器工作的第一步是输入源程序文本。为了更好地对单词符号辨认,把输入串预解决一下。预解决重要滤掉空格,跳过注释、换行符等。②对预解决后的输入串依次扫描单个字符,使用if-while嵌套语句和switchcase语句判断字符的类型,具体辨认方法可看状态转换图。有时为了拟定词性,需要超前扫描,若超前扫描的字符对辨认当前单词无用处,则需要退还给输入串,以备辨认下一单词字符时使用。③若读入的字符与单词符号编码表的字符匹配不上,则报错,并输出犯错行数。对辨认处的单词符号以(单词符号,种别码)二元式的形式输出。实验内容流程图程序的变量与函数说明input全局字符数组,用来存放输入串word全局字符数组,用来存放获取到的单词符号,限定长度为8ch全局字符变量,用来存放最新读入的字符syn全局整型变量,表达单词符号的编码p全局整型变量,表达当前字符在input数组的位置m全局整型变量,表达最新读入的字符在word数组的下标line全局整型变量,当前行数keyword全局字符数组,存放关键字init()获取输入串isKey()判断关键字的函数,若参数数组中是关键字,则把syn置为该关键字相应的编码并返回1,否则返回0isLetter()判断字母的函数,若参数字符是字母,则返回1,否则返回0isDigit()判断数字的函数,若参数字符是数字,则返回1,否则返回0isSpace()判断空白符的函数,若参数字符是空格、TAB或换行符,则返回1,否则返回0scaner()扫描输入串的函数,对读出的字符进行判断,若是单词符号表中的符号,则将syn置为相应的编码源程序#include<stdio.h>#include<string.h>charinput[1000];//输入串charword[8];//获取到的单词charch;intsyn;//种别码intp;intm;intline;//行数//关键字charkeyword[][8]={"main","if","else","while","do","for","switch","case","int","double","float","long","void"};voidscaner(void);//获取输入串voidinit(){ inti=0; printf("\npleaseinputastring(endwith'#'):\n"); do{ scanf("%c",&ch); input[i++]=ch; }while(ch!='#');}//判断是不是关键字intisKey(char*str){ intn; for(n=0;n<13;n++) { if(strcmp(str,keyword[n])==0) { syn=n; return1; } } return0;}//判断是不是数字intisDigit(charc){ if(c>='0'&&c<='9') return1; else return0;}//判断是不是字母intisLetter(charc){ if((c<='z'&&c>='a')||(c>='A'&&c<='Z')) return1; else return0;}intisSpace(charc){ if(c==''||c=='\t'||c=='\n') { return1; } return0;}voidmain(){ init();//输入字符串 line=0; p=0; do{ scaner(); switch(syn) { case-1: printf("youhaveinputawrongstringinline%d\n",line); break; default: printf("(%s,%d)\n",word,syn); break; } }while(syn!=21);}voidscaner(void){ //清空wordfor(m=0;m<8;m++) { word[m]=''; } //读取字符 ch=input[p++]; m=0; //当ch为空格或换行符时,继续往下读while(isSpace(ch)){ if(ch=='\n') { line++; } ch=input[p++]; } //假如以字母开头if(isLetter(ch)){ //假如往后是字母或数字,把字符存入word中,然后往下继续读 //串长超过8则截断 while((isLetter(ch)||isDigit(ch))&&m<8) { word[m++]=ch; ch=input[p++]; } p--; syn=43; word[m++]='\0'; isKey(word);//判断是不是关键字}//假如是以数字开头,并且往后是数字 elseif(isDigit(ch)){ while((isDigit(ch)||ch=='.')&&m<8) { word[m++]=ch; ch=input[p++]; } //假如数字之后是字母,则犯错 if(isLetter(ch)) { while(!isSpace(ch)) { ch=input[p++]; } syn=-1; return; } p--; syn=42;}else{ switch(ch) { //比较运算符 case'<': word[m++]=ch; ch=input[p++]; if(ch=='=') { syn=29; word[m++]=ch; } else { syn=28; p--; } break; case'>': word[m++]=ch; ch=input[p++]; if(ch=='=') { syn=27; word[m++]=ch; } else { syn=26; p--; } break; case'!': ch=input[p++]; if(ch=='=') { syn=31; word[m++]=ch; } else { syn=30; p--; } break; case'=': word[m++]=ch; ch=input[p++]; if(ch=='=') { syn=33; word[m++]=ch; } else { syn=32; p--; } break; //算术运算符+、-、*、/ case'+': word[m++]=ch; ch=input[p++]; if(ch=='+') { syn=15; word[m++]=ch; } elseif(ch=='=') { syn=14; word[m++]=ch; } else { syn=13; p--; } break; case'-': word[m++]=ch; ch=input[p++]; if(ch=='-') { syn=18; word[m++]=ch; } elseif(ch=='=') { syn=17; word[m++]=ch; } elseif(isDigit(ch)) { while(isDigit(ch)) { word[m++]=ch; ch=input[p++]; } p--; syn=42; } else { syn=16; p--; } break; case'*': word[m++]=ch; ch=input[p++]; if(ch=='=') { syn=23; word[m++]=ch; } else { syn=22; p--; } break; case'/': word[m++]=ch; ch=input[p++]; if(ch=='=') { syn=25; word[m++]=ch; } //假如是单行注释,则读到换行符为止 elseif(ch=='/') { word[m++]=ch; syn=45; while(ch!='\n') { ch=input[p++]; } line++; } //假如是多行注释,则读到匹配的*/为止 elseif(ch=='*') { word[m++]=ch; syn=46; intflag=1; while(flag) { ch=input[p++]; if(ch=='*') { if(input[p++]=='/') { word[m++]='*'; word[m++]='/'; flag=0; } else { p--; } } if(ch=='\n') { line++; } } } else { syn=24; p--; } break; //界符 case'(': syn=34; word[m++]=ch; break; case')': syn=35; word[m++]=ch; break; case'{': syn=36; word[m++]=ch; break; case'}': syn=37; word[m++]=ch; break; case';': syn=38; word[m++]=ch; break; case'#': syn=21; word[m++]=ch; break; case':': syn=39; word[m++]=ch; break; case',': syn=44; word[m++]=ch; break; //逻辑运算符 case'&': word[m++]=ch; ch=input[p++]; if(ch=='&') { syn=20;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 书画小年策划活动方案(3篇)
- 军人元旦活动策划方案(3篇)
- 啤酒比赛活动策划方案(3篇)
- 实体足浴活动方案策划(3篇)
- 情感社群活动策划方案(3篇)
- 活动策划方案财务保障(3篇)
- 盒装奶营销方案(3篇)
- 芍药采摘活动方案策划(3篇)
- 4.2《挑战与应对》教学设计 统编版高中政治选择性必修一当代国际政治与经济
- 妊娠合并贫血的输血指征与指南更新解读
- JG/T 503-2016承插型盘扣式钢管支架构件
- 延续护理服务体系构建与实践
- 早产儿低体温管理
- 电子技术基础第2版张虹课后答案
- 2024-2025学年河南省天一大联考高二下学期4月期中测试数学试卷(含答案)
- 国家开放大学《设施园艺学》形考作业1-3+实验报告1-2参考答案
- 小学生消化系统课件
- 2024年甘肃定西中考数学试题及答案2
- 黄精食品加工项目可行性研究报告模板-备案拿地
- 2024年上海交通大学医学院附属上海儿童医学中心贵州医院招聘 考试真题
- 2025年蜀道集团招聘笔试参考题库含答案解析
评论
0/150
提交评论