词法分析器实验报告通用_第1页
词法分析器实验报告通用_第2页
词法分析器实验报告通用_第3页
词法分析器实验报告通用_第4页
词法分析器实验报告通用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论