




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理 实验报告班级: 学号: 姓名: 一、 实验题目:词法分析程序二、 实验内容:、主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。)词法分析过程考虑该过程取名为 lexical,它根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置
2、,如未出现过,将标识符按顺序填入数组 id 中,将常数存入数组中 ci 中,并记录其在表中的位置。三、 程序源代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#define LEN sizeof(struct Node)#define NULL 0struct Node char data; struct Node *next; ;void Output1(struct Node*);void Scaner(); /*词法分析*/void S
3、caner1(); void GetBC();void GetChar();void Concat();int IsLetter(char ch);int IsDegit(char ch);int Reserve();void Retract();void Back(char *a,char *b);struct Node *head,*p;char ch; /*全局变量*/char *key="int","char","float","void","const","if",
4、"else","do","while","scanf","printf","return","main" /*关键字表*/char Token20; /*字符数组,存放构成单词的符号串*/char *id256;int ci 256;int i=0;int j=0;int opt;void main() head=(struct Node *)malloc(LEN); /*分配头节点存储空间*/ if(!head) printf("error&q
5、uot;); exit(1); head->next=NULL; head->data=' ' p=head;printf("如果想结束输入就在新的一行的开始输入$!n输入结束后屏幕上会输入你刚输入的代码n"); printf("请输入你的代码:n"); while(1) int i=0; char temp256;/*每行长度不超过256个字符*/ gets(temp); /*输入源程序,以行为单位*/ if(temp0='$') break;/*当输入的第一个字符为$时表示输入源代码结束*/ p->n
6、ext=(struct Node *)malloc(LEN); if(!(head->next) printf("error"); exit(1); / p=head; p=head->next; while(tempi!='0' && i<256) /*将输入的代码以行为单位存入缓冲区*/ p->data=tempi; p->next=(struct Node *)malloc(LEN); if(!(p->next) printf("error"); exit(1); p=p->
7、next; i+; p->data='n' p->next=NULL; /*尾结点*/ printf("你刚才输入的是代码为:n"); Output1(head); /*扫描缓冲区,输出结果*/ p=head->next;printf("经该词法分析器程序处理后输出结果为:n");printf("注:第一个无素1,2,3,4,5分别表关键字、表标识符、表常数、表运算符、表界符n");printf(" 第二无素为该单词在各自表中的指针或内部码值n"); / printf("
8、有两种输出格式,可通输入0或1 进行选择"); /opt=(int)getchar();while(p->next!=NULL) Scaner(); system("pause"); /return 0;void Output1(struct Node *head) /*扫描缓冲区函数*/ if(!(head) printf("error");exit(1); p=head->next; while(p->next!=NULL) printf("%c",p->data); p=p->next;
9、printf("n");void GetBC() /*若ch中是空白字符,则不停调用getch()直到读入的不是空白字符为止*/ while (ch=' ') GetChar();void GetChar() /*从缓冲区读入一字符*/ ch=p->data; p=p->next;void Concat() /*将ch中的字符连接到token的后面*/ unsigned int i; i=strlen(Token);if(ch!=' ') Tokeni=ch; Tokeni+1='0'int IsLetter(ch
10、ar ch) return isalpha(int)ch);int IsDigit(char ch) /*判断ch中的是否是数字*/ return isdigit(int)ch);int Reserve() /*判断token中的字符串是否是关键字或是标识符*/ int k; for(k=0;k<13;k+) if(strcmp(keyk,Token)=0) return (k+1); return 0;void Retract() /*指针回退一个字符*/ struct Node *Q; Q=head->next; while(Q->next!=p) Q=Q->nex
11、t; p=Q;void Back(char *a,char *b) printf("(%s,%s)n",a,b);void Scaner() int c; Token0=NULL; GetChar(); GetBC(); if(IsLetter(ch) while(IsLetter(ch)|IsDigit(ch) Concat(); GetChar(); Retract(); c=Reserve(); if(c!=0) printf("<1,%d>n",c); elseprintf("<2,%d>n",i);i
12、di=Token;i+; else if(IsDigit(ch) while(IsDigit(ch) Concat(); GetChar(); Retract(); printf("<3,%d>n",j);cij=atoi(Token);j+; else switch(ch) case'+': GetChar(); if(ch='+') printf("<4,39>n"); Retract(); printf("<4,15>n"); break; case'-
13、': GetChar(); if(ch='-')printf("<4,40>n"); Retract(); printf("<4,16>n"); break;case'&':GetChar(); if(ch='&') printf("<4,27>n"); printf("errorn"); Retract(); case'|':GetChar(); if(ch='|') pri
14、ntf("<4,28>n"); Retract(); break; case'*': printf("<4,17>n"); break; case'/': printf("<4,18>n");break;case'%': printf("<4,19>n");break; case'<': GetChar(); if(ch='=')printf("<4,26>n&
15、quot;); Retract(); printf("<4,23>n"); break; case'>': GetChar(); if(ch='=') printf("<4,25>n"); Retract(); printf("<4,22>n"); break; case'':printf("<5,35>n");break;case',': printf("<5,36>n&qu
16、ot;);break;case'"': printf("<5,37>n");break; case'': printf("<5,33>n");break; case'':printf("<5,34>n");break; case'(':printf("<5,31>n");break; case')':printf("<5,32>n");break; case'=':GetChar(); if(ch='=') printf("<4,21>n"); Retract(); printf("<5,20>n"); break;case'!':GetChar(); if(ch='=') printf("<5,24>n"); Retract(); printf("<5,29>n"); break; case'n': break
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 邵阳市重点中学2024-2025学年初三5月毕业班模拟考试数学试题含解析
- 江苏省盐城市响水实验、一中学2025届初三下学期零诊模拟生物试题含解析
- 廊坊卫生职业学院《成衣制作工艺》2023-2024学年第二学期期末试卷
- 江西师范大学科学技术学院《prote软件设计》2023-2024学年第二学期期末试卷
- 延寿县2025届数学四年级第二学期期末质量检测模拟试题含解析
- 天府新区航空旅游职业学院《欧美设计规范释义一双语》2023-2024学年第二学期期末试卷
- 天津石油职业技术学院《珠宝专业英语》2023-2024学年第二学期期末试卷
- 塔里木职业技术学院《测井资料解释课程设计》2023-2024学年第一学期期末试卷
- 辽宁税务高等专科学校《影像诊断学》2023-2024学年第二学期期末试卷
- 文山壮族苗族自治州马关县2024-2025学年数学三下期末综合测试模拟试题含解析
- 美国学生阅读技能训练
- 网络安全服务项目服务质量保障措施(实施方案)
- 生产加工型小微企业安全管理考试(含答案)
- 青少年科技创新比赛深度分析
- 世界近代武器革新图鉴(1722-1900)英国篇
- 安标受控件采购管理制度
- 亚低温的治疗与护理
- 危险化学品企业设备完整性 第2部分 技术实施指南 编制说明
- 防高坠自查自纠台账
- GB/T 4437.1-2023铝及铝合金热挤压管第1部分:无缝圆管
- 市政工程消耗量定额 zya1-31-2015
评论
0/150
提交评论