




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学 号 编译原理实验1:词法分析器设计学生姓名专业、班级指导教师成绩计算机与信息工程学院2018 年 11 月 20 日一、实验目的1. 理解词法分析程序的功能。2. 熟悉词法分析程序的设计原理和构造方法。3. 理解词法分析程序输出单词的形式。4. 设计实现针对简单语言的一个词法分析程序。二、实验要求1. 根据书P199给出的简单语言的词法和各单词符号种别码表,编写C或C+语言源程序,实现针对该简单语言的词法分析器;2. 独立做实验,输入、调试所编程序;3. 实验结束后,根据实验报告模板编写实验报告。三、实验内容和步骤用 Visual C+作为实验开发环境,创建一个Win32 Console
2、Application工程,工程名为你的学号,添加三个文件:(1)存储结构定义:以LexerDef.h为文件名; (2)基本操作和算法:以LexerAlgo.h为文件名; (3)调用基本操作的主程序:以LexerMain.cpp为文件名。编写程序:(1)文件LexerDef.h定义单词符号的二元组结构、全局变量、关键字表的结束标志等。(2)文件LexerAlgo.h实现词法扫描算法scanner及其所需的各种基本操作算法。(3)文件LexerMain.cpp调用scanner算法,实现词法分析器的功能。源程序代码:=LexerDef.h=#define _KEY_WORD_END "
3、waiting for your expanding"typedef structint typenum;char * word;WORD;=LexerAlgo.h=#include"LexerDef.h"char input50=""char token255=""int p_input;int p_token; char ch;char * rwtab="begin","if","then","while","do",&q
4、uot;end",_KEY_WORD_END;/从输入缓冲区读取一个字符到ch中char m_getch()ch=inputp_input;p_input=p_input+1;return(ch);/去掉空白符号void getbc()while(ch=' '|ch=10)ch=inputp_input;p_input=p_input+1;/拼接单词void concat()tokenp_token=ch;p_token=p_token+1;tokenp_token='0'/判断是否字母int letter()if(ch>='a'
5、&&ch<='z'|ch>='A'&&ch<='Z')return 1;elsereturn 0;/判断是否为数字int digit()if(ch>='0'&&ch<='9')return 1;else return 0;/检索关键字表格int reserve()int i=0;while(strcmp(rwtabi,_KEY_WORD_END)if(!strcmp(rwtabi,token)return i+1;i+;return 10
6、;void retract()p_input=p_input-1;char * dtb()return NULL;WORD * scaner()WORD * myword=new WORD;myword->typenum=10;myword->word=""p_token=0;m_getch();getbc();if(letter()while(letter()|digit()concat();m_getch();retract();myword->typenum=reserve();myword->word=token;return(myword)
7、;else if(digit()while(digit()concat();m_getch();retract();myword->typenum=20;myword->word=token;return(myword);else switch(ch)case '=':m_getch();if(ch='=')myword->typenum=39;myword->word="="return(myword);retract();myword->typenum=21;myword->word="=&q
8、uot;return(myword);break;case '+':myword->typenum=22;myword->word="+"return(myword);break;case '-':myword->typenum=23;myword->word="-"return(myword);break;case '*':myword->typenum=24;myword->word="*"return(myword);break;case
9、9;/':myword->typenum=25;myword->word="/"return(myword);break;case '(':myword->typenum=26;myword->word="("return(myword);break;case ')':myword->typenum=27;myword->word=")"return(myword);break;case '':myword->typenum=28;myw
10、ord->word=""return(myword);break;case '':myword->typenum=29;myword->word=""return(myword);break;case '':myword->typenum=30;myword->word=""return(myword);break;case '':myword->typenum=31;myword->word=""return(myword)
11、;break;case ',':myword->typenum=32;myword->word=","return(myword);break;case ':':m_getch();if(ch='=')myword->typenum=18;myword->word=":="return(myword);retract();myword->typenum=33;myword->word=":"return(myword);break;case '
12、':myword->typenum=34;myword->word=""return(myword);break;case '>':m_getch();if(ch='=')myword->typenum=37;myword->word=">="return(myword);retract();myword->typenum=35;myword->word=">"return(myword);break;case '<':
13、m_getch();if(ch='=')myword->typenum=38;myword->word="<="return(myword);retract();myword->typenum=36;myword->word="<"return(myword);break;case '!':m_getch();if(ch='=')myword->typenum=40;myword->word="!="return(myword);retra
14、ct();myword->typenum=-1;myword->word="ERROR"return(myword);break;case '0':myword->typenum=100;myword->word="OVER"exit(0);return(myword);break;default:myword->typenum=-1;myword->word="ERROR"return(myword);=LexerMain.cpp=#include<stdio.h>#i
15、nclude<stdlib.h>#include<string.h>#include"LexerAlgo.h"WORD * scaner();void main(void)int over=1;WORD* oneword=new WORD;printf("Enter Your words(end with #):");scanf("%#s",input);p_input=0;printf("Your words:n%sn",input);while(over<1000&&
16、;over!=-1)oneword=scaner();if(oneword->typenum<1000)printf("(%d,%s)",oneword->typenum,oneword->word);over=oneword->typenum;printf("npress # to exit:");scanf("%#s",input);四、解答下列问题(1)简述词法分析器的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相
17、应的单词符号。1.主程序示意图关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”;置初值调用扫描子程序输出单词二元组输入串结束 否 是结束 程序需要用到的主要变量为syn,token和sum。2. 扫描子程序的算法思想 首先设置3个变量:(1)token用来存放构成单词符号的字符串;(2)sum用来存放整型单词(3
18、)syn用来存放单词符号的种别码。(2)画出词法扫描算法scanner识别简单语言的状态转换图DFA(可手画再插入图片)(3)解释子程序reverse的每句代码含义 reserve函数的作用是遍历关键字表格,判断当前存入token的字符串是否是关键字首先先设定一个初值为0的变量i(存在于while外部,会因为循环内部的操作而进行改变)while条件内部完整代码应为:while(strcmp(rwtabi,_KEY_WORD_END)!=0),strcmp函数的作用是判断两个字符串是否相等:设两个字符串str1,str2,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。已知关键字表格中最后一个元素为_KEY_WORD_END,所以这行代码的意思就是,从关键字表格中第一个字符串开始遍历(循环一次后i+),遍历到最后一个通过strcmp函数运算等于零不满足循环条件所以跳出循环。循环体内部if当前字符串和遍历到的关键字进行比较,两者相等时满足条件(!0!=0),相等时返还i+1。最后返还10(关键字的种别码)(4)针对文件LexerMain.cpp中main
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年成人高考语文高频考点速记题库(作文素材积累技巧)
- 2025年乡村医生考试题库:农村医疗卫生服务体系建设基层卫生服务体系建设专业知识试题及案例分析
- 2025年乡村医生考试题库:农村医疗卫生机构管理与基层医疗机构发展模式创新试题试卷
- 环境保护课题研究工作报告范文
- 二年级数学计算题专项练习集锦
- 五年级数学(小数乘法)计算题专项练习及答案
- 2024年度安徽省三支一扶之公共基础知识典型题汇编及答案
- 肝叶切除术护理
- 机电一体化与机器人技术结合的实习报告范文
- 高中历史文化课题研究:研究报告范文
- 2024年新青岛版(六三制)六年级下册科学全册知识点
- 标识标牌制作安装实施方案
- 五年级下册数学计算题100道及答案
- 《如何提高自信心》课件
- 脊柱侧弯的中医治疗研究
- 《字体设计第三章》课件
- 中建工法样板施工方案
- 网络安全运维课程标准
- 真武信仰的渊源与流变研究
- 阳光分级阅读 Sloppy Tiger and the Party 课件
- 危险货物运输人员的培训和教育
评论
0/150
提交评论