预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编- 译 原 理 实 验 报 告 - 实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其 基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1)主程序 输入要分析的语句 判断读入字符是否为” 调用扫描、分析程序 输出单词符号二元组 结束 (2)扫描子程序 - Token清空 Get() 当前字符=? 标示符常数表中查找结束Error() 基本字用户标示符 输出二元式 结束 3、各种单词符号对应的种别码 单词符号种别码助记符码值 while1while- if2if- else3else- switch4switch- case5case- 标识符6idid在符号表中的 位置 常数7numnum在常数表中的 位置 +8+- -9-- *10*- <=11relopLE <11relopLT ==11relopEQ =12=- ;13;- - 五、实验容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s(char型),i,j,k (int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正 在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分 析完毕,结束分析程序,若否则通过intdigit(charc)、intletter(charc)判断其是数字, 字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行, 还要通过函数intlookup(chartoken[])来判断标识符和保留字。 2实验词法分析器源程序: #include<stdio.h> #include<math.h> #include<string.h> inti,j,k; charc,s,a[20],token[20]={'0'}; intletter(chars){ if((s>=97)&&(s<=122))return(1); elsereturn(0); } intdigit(chars){ if((s>=48)&&(s<=57))return(1); elsereturn(0); } voidget(){ s=a[i]; i=i+1; } voidretract(){ i=i-1; } intlookup(chartoken[20]){ elsereturn(0); } voidmain() { i=0; do{i=i+1; - }while(a[i]!='#'); i=1; j=0; get(); while(s!='#'){memset(token,0,20); switch(s) { 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': case'*': case'y': case'z': while(letter(s)||digit(s)) {token[j]=s; j=j+1; get(); } retract();k=lookup(token); if(k==0) break; - case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': while(digit(s)){ token[j]=s; j=j+1; get(); } retract(); break; case'<':get(); else{retract(); } break; case'=': get(); if(s=='=') else{ retract(); } break; case';': break; case'':break; } j=0; get(); -