1、编译原理实验词法分析器的设计集美大学计算机工程学院实验报告课程名称:编译原理班级:指导教师: : 实验项目编号:实验一学号:实验项目名称:词法分析器的设计实验成绩:一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验内容编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 三、实验要
2、求 1、 词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。单词示例单词种别码要求保留字if、else、int、while、do每个保留字的单词种别都单独为一种标识符以字母开头且包含字母和数字的字符串标识符作为一种常数(只识别无符号整数)123、343无符号整数作为一种运算符+、-、*、/、=、= = 、!=、 、=、 、4分隔符,、;、(、)5本实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数: 2.程序流程图: Y N Y N N Y Y N Y N Y Y N N N Y Y
3、N N N Y Y Y N Y N3、实验程序#include#include#include#include/判断读入的字符是否为字母bool isLetter(char c) if(c = a & c = A & c =0 & c = 9) return true; else return false; /判断是否为关键字bool isKey(char *string) if(!strcmp(string,void) | !strcmp(string,if)| !strcmp(string,for)| !strcmp(string,while) | !strcmp(string,do)|
4、!strcmp(string,return)| !strcmp(string,break) | !strcmp(string,main)| !strcmp(string,int)| !strcmp(string,float)| !strcmp(string,char) | !strcmp(string,double)| !strcmp(string,String) return true; else return false;bool isError(char ch) if(ch = | ch = $ | ch = & | ch = # | ch = | ch = ) return true;
5、 else return false;void main() char string500=;/存放文件中读出来的字符串 char str10=;/存放需要对比的字符串 char ch,c;/ch存放文件中的单个字符(翻译时用),c存放文件中的单个字符(从文件中提取信息时用) char filename20;/文件名 int j=0; printf(请输入文件名进行词法翻译:); scanf(%s,filename); FILE *cfPtr; if(cfPtr=fopen(filename,r)=NULL) printf(文件未找到!); else while(!feof(cfPtr) if
6、(isspace(c=fgetc(cfPtr)/判断是否是字符串 ; else stringj=c;/从文件中一一提取字符 j+; int m = 0,k=0;/m翻译时用,k是str数组的下标 stringj= ; j+; bool check=true,error=false;/用于判断标识 for(int i = 0;i | ch = ) if(error) printf(%s,此字符无法是识别!n,str); error=false; check=true; else if(!check) printf(2,%s)标示符n,str); check=true; m = 4; else i
7、f(ch = , | ch = ; | ch = | ch = | ch = ( | ch = ) if(error) printf(%s此字符无法识别n,str); error=false; check=true; else if(!check) printf(2,%s)标示符n,str); check=true; m = 5; else if ( isDigit(ch =stringi) ) ) if(check) memset(str, 0, strlen(str);/清空 k=0; strk=ch; k+; m = 3; check=false; else strk=ch; k+; e
8、lse if ( isLetter(ch = stringi) ) if(check) check=false; memset(str, 0, strlen(str); k=0; strk=ch; k+; else strk=ch; k+; if(isKey(str) printf(1,%s)关键字n,str); check=true; else if(isError(ch = stringi) if(check) memset(str, 0, strlen(str);/清空 k=0; strk=ch; k+; check=false; error=true; else strk=ch; k+
9、; error=true; else break; case 3: if(isLetter(ch =stringi) printf(程序有错误!n); strk = ch; k+; error=true; m = 0; break; if(isError(ch = stringi) printf(程序有错误!n); strk = ch; k+; error=true; m = 0; break; if (isDigit(ch =stringi ) ) strk = ch; k+; else if(ch=.) strk=ch; k+; else printf( 3,%s) 数字n,str); i -; m = 0; check=true; break; case 4: i-; printf( 4 ,%c) 运算符n,ch); m = 0; break; case 5: i -; printf( 5 ,%c) 分隔符n,ch); m = 0; break; return;五、实验结果 六、实验小结本次实验中,运用C语言进行实验,实验刚开始的时候,能够对输入的字符进行判断,但是却不能排错以及只能识别全是字母的标识符,后来经过修改程序代码和编程的逻辑最终实现了,既能排错又能分析句子;通过实验掌握了词法分析,能实现对普通程序的语法分析翻译。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1