教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 小学教育 >

(实验报告模板)实验1:词法分析

来源:网络收集 时间:2026-07-16
导读: 编译原理 实验报告 学院(系)名称:计算机与通信工程学院 编译原理 空白 字母或数字 编译原理 因为在课本中已经对词法分析器做了很明确的分析,所以只要把代码变成真正可执行的C语言即可,我是参照课本的; 编程思路:根据书中提供的大致代码,不难把一些类

编译原理

实验报告

学院(系)名称:计算机与通信工程学院

编译原理

空白 字母或数字

编译原理

因为在课本中已经对词法分析器做了很明确的分析,所以只要把代码变成真正可执行的C语言即可,我是参照课本的;

编程思路:根据书中提供的大致代码,不难把一些类似letter() digit()的函数写出来,程序中是用ch来表示字符的,可是要判断每一个读入的字符,不难想到用数组来实现(当然数据结构中的栈实现起来或许更好一些,但能力有限了),这样只要prog[p]中p++即可判断下一字符,扫描到下一字符为非类型字符时p-1即可(即retract()函数)。而判断是否为保留字还是想了不短的时间,首先想到prog[p]、p++逐个字符检查,可是逐个字符检查发现没有办法和保留字对比,或者说比起来很麻烦,查资料后发现用strcmp()函数可以比较容易的实现,只要将token和keyword[j]进行对比,如果二者相同结果返回j+1那么就是第j+1个保留字,否则返回0,之后再进行处理。用strcmp()函数时还需#include<string.h>。程序需要的一些函数基本定义完后开始写主函数,写主函数还是比较纠结的,因为虽然大体框架很清晰,但一些衔接的地方还是不知道该怎么办。就像空格的问题就想了很久,如程序输入时就有空格,程序中间出现空格,不知道该怎么处理。比较token与关键词的时候,本来是用 for(j=0;j<=4;j++) {

if(strcmp(token,keyword[j])==0) {

return j+1;

} else

return 0;

}

但执行一次只有while可以识别,剩下的关键字被return 0了,所以改成了下面的做法 if(strcmp(token,keyword[0])==0) return 1;

else if(strcmp(token,keyword[1])==0) return 2

没有把token[]置空会出现如下错误

把一个数组置空网上给出了如下方法:

也就是memset(token,0,sizeof(token)) 没见过,所以用了比较笨的方法,如下: for(i=0;i<20;i++)

token[i]=NULL; 即可清空数组

编译原理

.代码如下:

#include<stdio.h> #include<string.h> char ch;

char token[20],prog[20]; int i,p,c;

char *keyword[5]={"while","if","else","switch","case"}; int reserve() //判断是否为保留字 {

if(strcmp(token,keyword[0])==0) return 1;

else if(strcmp(token,keyword[1])==0) return 2;

else if(strcmp(token,keyword[2])==0) return 3;

else if(strcmp(token,keyword[3])==0) return 4;

else if(strcmp(token,keyword[4])==0) return 5; else return 0; }

int letter() //判断是否为字母 {

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') return 1; else return 0; }

int digit() //判断是否为数字 {

if(ch>='0'&&ch<='9') return 1; else return 0; }

int retract() //指针回退一个字 {

p=p-1; }

void get() {

ch=prog[p]; p++; }

编译原理

void main() {

printf("please input the sentence,end with '#'"); p=0;

do //先将#以前的所有字符读入prog[p]数组 { p++; scanf("%c",&prog[p]); }while(prog[p]!='#'); //!!!!!!!!由于上面采用的是do..while所以读入的第一个 p=1; for(i=0;i<20;i++) token[i]=NULL; i=0; get();

while(ch!='#') { if(ch==' ') get(); else { switch(ch) { case'a': case'b': case'c': case'd': case'e': case'f': case'g': case'h': case'i': case'j': case'k': case'l': case'm': case'n': case'o': case'p': case'q': case'r': case's': case't': case'u': case'v': case'w':

//字符时存在p=1的,所以先要使p=1,这是必须的 //清空token[]数组

编译原理

case'x': case'y': case'z':

while(letter(ch)||digit(ch)) { token[i]=ch; i++; get(); }

retract();

c=reserve(); if(c==0) { printf("(标识符%s,种别编码6)\n",token); } else printf("保留字%s,种别编码%d\n",token,c); break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9':

while(digit(ch)) { token[i]=ch; i=i+1; get(); }

retract();

printf("常数%s\n",token); break; case'+': printf("(加,+)\n");break; case'-': printf("(减,-)\n");break; case'*': printf("(乘,*)\n");break; case'<':

编译原理

get(); if(ch=='=') printf("(小于等于,<=)\n"); else { retract(); printf("(小于,<)\n"); } break; case'=': get(); if(ch=='=') printf("(赋值,==)\n"); else { retract(); printf("(等于,=)\n"); } break; case';': printf("(分号,;)\n"); break; case'(': printf("(\n");break; case')': printf(")\n");break; default: printf("(无效字符,%c)\n",ch); } for(i=0;i<20;i++) token[i]=NULL; i=0; //对token[]数组进行完操作需把i归0, get(); //指向第一个存储单元,否则token[]数组 } //置空,是无法输出的 } }

实验结果:

编译原理

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

这个程序还有不足的地方,比如可以识别的关键字只有keyword[]里的五个保留字,如果想要增加,增加的代码虽简单但是却冗长,不如循环做得好:

for(n=0;n<6;n++)

if(strcmp(token,keyword[n])==0) { blz=n+1; break; } } 这样就可以判断出保留字并且返回blz就是保留字的种别编码,不过由于我的程序后面是根据c=reserve()的c值来输出的,所以上述的循环体不太合适

…… 此处隐藏:1481字,全部文档内容请下载后查看。喜欢就下载吧 ……
(实验报告模板)实验1:词法分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/41196.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)