




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一部分 词法分析实验一、简单的扫描器设计一、实验目的:熟悉并实现一个简单的扫描器二、实验内容:1 设计扫描器的自动机;2 设计翻译、生成token的算法;3 编写代码并上机调试运行通过。要求:输入源程序文件;输出(1)相应的token序列; (2)关键字、界符表,符号表,常数表。三、扫描器设计:扫描器 单词 token1 自动机: 空 l/d 关键字表和界符表 l -1 单词 编码 d program 3 d -1 procedure 4 begin 5 + end 6 while 7 * do 8 + 9 : = * 10 : 11 -1 := 12 = 13 , 14 , ; 15 -1
2、 2 关键字表和界符表:四、程序实现:1数据结构:char ch; /当前字符char strtoken; /当前单词char *keywords=“program”, “procedure”, “begin”,; /关键字表、界符表char id; /符号表int cons; /常数表struct tokentype int code,value; struct tokentype token; /token数组2算法设计:1 初始化;2 滤除空格,读取第一个非空字符到ch;3 if (ch是一个字母) 4 处理关键字或标识符;5. else if (ch是一个数字) 6. 处理常数; el
3、se 7. 处理界符或错误处理;3算法求精:step2 : ch=getchar(); /读取当前字符到ch while (ch= )ch=getchar();step3: int isletter(char ch) /判断ch是否为字母 if (ch是az或az) return 1;else return 0;step4:4.1 在strtoken中拼成一个单词; /拼关键字或标识符4.2 code=reserve(strtoken); /查关键字表; if (!code) /未查到,是一个标识符 4.3 value=insertid(strtoken); /将strtoken中的单词插入到
4、符号表中4.4 生成并输出一个标识符token; else4.5 生成并输出一个关键字token;step5: int isdigit(char ch) /判断ch是否为数字 if (ch是09) return 1;else return 0;step6:6.1 在strtoken中拼成一个单词; /拼常数6.2 value=insertconst(strtoken); /将strtoken中的单词插入到常数表中6.3 生成并输出一个常数token;step7:7.1 将ch中的字符拼接到strtoken中; if (ch=:) 7.2 处理双界符“:=”;7.3 code:=bound(st
5、rtoken); /查界符表 if (!code) /未查到 procerror(); /错误处理 else7.4 生成并输出一个界符token;step4.1: while (isletter(ch)|isdigit(ch) concat(); /将ch中的字符拼接到strtoken中 ch=getchar();step4.2: int reserve(char *strtoken) /用strtoken中的单词去查关键字表。查到了,则返回该关键字的编码;/否则,返回0 int i=0; while (in) /设n为关键字表中元素的个数 if (!strcmp(keywordsi, str
6、token) return (i+3); i+; return 0; step4.3: int insertid(char *strtoken) /用strtoken中的单词去查符号表。查到了,则返回该单词在表中的位置值;/否则,将strtoken中的单词插入符号表的尾部,并返回位置值 int i=0; while (im) /设m为符号表中已有的标识符的个数 if (!strcmp(idi, strtoken) return i; i+; strcpy(idi,strtoken); m+; return i; step4.4: tokeni.code=1; tokeni.value=valu
7、e; print(tokeni+); /输出tokenstep4.5: tokeni.code=code; tokeni.value=-1; print(tokeni+); /输出tokenstep6.2: int insertconst(char *strtoken) /用strtoken中的单词去查常数表。查到了,则返回该单词在表中的位置值;/否则,将strtoken中的单词插入常数表的尾部,并返回位置值 int i=0; int num; num=trans(strtoken); /将常数串转换为数字 while (i=a & ch=a & ch=0 & ch=9) return 1;
8、else return 0;int reserve(char *strtoken) /用strtoken中的单词去查关键字表。查到了,则返回该关键字的编码; /否则,返回0 int i=0; while (in) /设n为关键字表中元素的个数 if (!strcmp(keywordsi, strtoken) return (i+3); i+; return 0;int insertid(char *strtoken) /用strtoken中的单词去查符号表。查到了,则返回该单词在表中的位置值; /否则,将strtoken中的单词插入符号表的尾部,并返回位置值 int i=0; while (i
9、m) /设m为符号表中已有的标识符的个数 if (!strcmp(idi, strtoken) return i; i+; strcpy(idi,strtoken); m+; return i;int trans(char *str)int num,i;num=i=0;while (stri)num=10*num+stri+-48;return num;int insertconst(char *strtoken) /用strtoken中的单词去查常数表。查到了,则返回该单词在表中的位置值; /否则,将strtoken中的单词插入常数表的尾部,并返回位置值 int i=0; int num;
10、num=trans(strtoken); /将常数串转换为数字 while (in) /设n为常数表中已有的常数的个数 if (consi=num) return i; i+; consi=num; n+; return i;int main(int argc, char* argv) char line= while (x1=10) do y:=x1;int i_line;char ch; /当前字符 char strtoken15; /当前单词int i_str; struct tokentype token50; /token数组 int code,value; int i; i=0;
11、i_line=0;ch=linei_line+; /读取当前字符到ch while (ch) i_str=0; while (ch= ) ch=linei_line+; if (isletter(ch) while (isletter(ch)|isdigit(ch) /拼关键字或标识符 strtokeni_str+=ch; /将ch中的字符拼接到strtoken中 ch=linei_line+; i_line-; /retract()strtokeni_str=0; code=reserve(strtoken); /查关键字表; if (!code) /未查到,是一个标识符 value=ins
12、ertid(strtoken); /将strtoken中的单词插入到符号表中 tokeni.code=1; tokeni.value=value; print(tokeni+); /输出token else tokeni.code=code; tokeni.value=-1; print(tokeni+); /输出token else if (isdigit(ch) / 处理常数; while (isdigit(ch) /拼常数 strtokeni_str+=ch; /将ch中的字符拼接到strtoken中 ch=linei_line+; i_line-; /retract() strtoke
13、ni_str=0; value=insertconst(strtoken); /将strtoken中的单词插入到常数表中 tokeni.code=2; tokeni.value=value; print(tokeni+); /输出token else / 处理界符或错误处理; strtokeni_str+=ch; /将ch中的字符拼接到strtoken中; if (ch=:) / 处理双界符:=; ch=linei_line+; if (ch=) strtokeni_str+=ch; else i_line-; /回溯一个字符 strtokeni_str=0; code=reserve(str
14、token); /查界符表 if (!code) /未查到 procerror(); /错误处理 else /生成并输出一个界符token; tokeni.code=code; tokeni.value=-1; print(tokeni+); /输出token ch=linei_line+; printf(n); for (i=0;im;i+)printf(%s ,idi);printf(n); for (i=0;in;i+)printf(%d ,consi);printf(n);printf(hello world!n);return 0;实验二、扫描器类的设计一、二、三、同实验一。四、程序
15、设计:数据结构:struct tokentype /token类型 int code,value; ; struct semrecord /符号表记录类型 char name15; semrecord id10; /符号表 int m=0; /标识符个数 int cons10; /常数表 int n=0; /常数个数tokentype token; /tokenclass scan /扫描器类 private: char *keywordsn; /关键字表、界符表 char line50; int i_line; char ch; /当前字符 char strtoken15; /当前单词 in
16、t i_str; int code,value; int i; semrecord *p_id; /符号表指针 int *p_m; int *p_cons; /常数表指针 int *p_n;public:scan();scan(semrecord *p1,int *p2,int *p3,int *p4);void read(tokentype *token); /read(w)private: void procerror(); int isletter(char ch); int isdigit(char ch); int reserve(char *strtoken); int inser
17、tid(char *strtoken); int trans(char *str); int insertconst(char *strtoken);scan sexam(id,&m,cons,&n); /扫描器类对象五、源程序代码/scaner.h扫描器类设计#define n 15char keysn15=program,procedure,begin,end,while,do,+,*,:,:=,=,;,(,);struct tokentype /token类型 int code,value; ;struct semrecord /符号表记录类型 char name15;class sca
18、n /扫描器类 private: char *keywordsn; /关键字表、界符表 char line50; int i_line; char ch; /当前字符 char strtoken15; /当前单词 int i_str; int code,value; int i; semrecord *p_id; /符号表指针 int *p_m; int *p_cons; /常数表指针 int *p_n;public:scan();scan(semrecord *p1,int *p2,int *p3,int *p4);void read(tokentype *token); /read(w)p
19、rivate: void procerror(); int isletter(char ch); int isdigit(char ch); int reserve(char *strtoken); int insertid(char *strtoken); int trans(char *str); int insertconst(char *strtoken);scan:scan(semrecord *p1,int *p2,int *p3,int *p4) p_id=p1; p_m=p2; p_cons=p3; p_n=p4; int i; for (i=0;i=a & ch=a & ch
20、=0 & ch=9) return 1; else return 0;int scan:reserve(char *strtoken) /用strtoken中的单词去查关键字表。查到了,则返回该关键字的编码; /否则,返回0 int i=0; while (in) /设n为关键字表中元素的个数 if (!strcmp(keywordsi, strtoken) return (i+3); i+; return 0;int scan:insertid(char *strtoken) /用strtoken中的单词去查符号表。查到了,则返回该单词在表中的位置值; /否则,将strtoken中的单词插入
21、符号表的尾部,并返回位置值 int i=0; while (iname, strtoken) return i; i+; strcpy(p_id+i)-name,strtoken); (*p_m)+; return i;int scan:trans(char *str)int num,i;num=i=0;while (stri)num=10*num+stri+-48;return num;int scan:insertconst(char *strtoken) /用strtoken中的单词去查常数表。查到了,则返回该单词在表中的位置值; /否则,将strtoken中的单词插入常数表的尾部,并返
22、回位置值 int i=0; int num; num=trans(strtoken); /将常数串转换为数字 while (icode=0; token-value=-1;return; i_str=0; while (ch= ) ch=linei_line+; if (isletter(ch) while (isletter(ch)|isdigit(ch) /拼关键字或标识符 strtokeni_str+=ch; /将ch中的字符拼接到strtoken中 ch=linei_line+; i_line-; strtokeni_str=0; code=reserve(strtoken); /查关
23、键字表; if (!code) /未查到,是一个标识符 value=insertid(strtoken); /将strtoken中的单词插入到符号表中 token-code=1; token-value=value; else token-code=code; token-value=-1; else if (isdigit(ch) / 处理常数; while (isdigit(ch) /拼常数 strtokeni_str+=ch; /将ch中的字符拼接到strtoken中 ch=linei_line+; i_line-; strtokeni_str=0; value=insertconst(
24、strtoken); /将strtoken中的单词插入到常数表中 token-code=2; token-value=value; else / 处理界符或错误处理; strtokeni_str+=ch; /将ch中的字符拼接到strtoken中; if (ch=:) / 处理双界符:=; ch=linei_line+; if (ch=) strtokeni_str+=ch; else i_line-; /回溯一个字符 strtokeni_str=0; code=reserve(strtoken); /查界符表 if (!code) /未查到 procerror(); /错误处理 else /
25、生成并输出一个界符token; token-code=code; token-value=-1;/主程序#include string.h#include scaner.hint main(int argc, char* argv) semrecord id10; /符号表 int m=0; int cons10; /常数表 int n=0;int i; tokentype token;scan sexam(id,&m,cons,&n);dosexam.read(&token);printf(%d,%d),token.code,token.value);while (token.code);printf(n); for (i=0;im;i+)printf(%s ,id);printf(n); f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届河北省忠德学校衡水教学部高三上化学期中统考试题含解析
- 2025年高考英语翻译:英汉互译能力提升模拟试卷
- 2026届江西省校级联考化学高一上期中调研模拟试题含解析
- 福建省莆田九中2026届化学高一第一学期期中经典模拟试题含解析
- 2026届甘肃省兰州市甘肃一中化学高一第一学期期末学业水平测试试题含解析
- 婚前财产约定协议
- 线上线下活动合作协议的特点
- 2026届安徽省二校联考化学高三上期中联考试题含解析
- 2025年住房租赁市场供需关系研究及策略优化服务合同
- 2025年城市轨道交通车辆融资租赁与抵押担保合同
- 弱电工程施工进度表(甘特图)
- GB 1886.232-2016食品安全国家标准食品添加剂羧甲基纤维素钠
- 2023年赣州市建兴控股投资集团有限公司招聘笔试题库及答案解析
- 地理信息系统技术概述课件
- 脑梗死病人-护理查房课件
- 人类行为与社会环境全套课件
- 医院介入手术病人护送交接流程
- 学校家庭教育指导(班主任培训班) 课件
- 骨关节结核教案
- 楼板厚度检测报告
- 纳米材料ppt课件精品课件
评论
0/150
提交评论