您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > C_minus语言词法分析器实验报告
编译原理实验报告题目:C_minus语言词法分析器学院计算机科学与技术专业xxxxxxxxxxxxxxxx学号xxxxxxxxxxxx姓名xxxx指导教师xxxx20xx年xx月xx日装订线C_minus语言词法分析器一、实验目的1.理解词法分析器的设计方法:利用DFA编写相应的程序。2.掌握手工编写词法分析程序的方法。3.复习熟悉以前学过的编程语言4.通过实验了解编译器词法分析的工作原理二、实验原理1.文法的概念,DFA的表示方法。2.词法分析程序的输出和输入:词法分析程序的功能是读入源程序,输出单词符号。单词符号是程序设计语言的比本语法符号,程序设计语言的单词符号一般分为如下几种:关键字,标示符,常数,运算符,界符,单词的输出是二元式的形式,需要知道二元式的表示方法,把得到的二元式写入输出文件。转化图如下:3.熟悉单词的描述工具,如正规文法,正规式,以及知道正规文法和正规式的等价性以及他们之间的互相转化。熟悉把正规文法转化为正规式,把正规式转化为NFA以及把NFA转为相应的DFA,最后再把DFA简化,DFA的状态转化为相应的子程序,最后得到词法分析器4.C语言的基本语法。三、实验要求1、该个词法分析器要求至少能够识别以下几类单词:关键字:elseifintreturnvoidwhile共6个,所有的关键字都是保留字,并且必须是小写;标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID=letter(letter|digit)*;常数:NUM=digitdigit*(.digitdigit*|ε)(e(+|-|ε)digitdigit*|ε),letter=a|..|z|A|..|Z|,源程序词法分析程序记号文件digit=0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等;专用符号:+-*/====!==,()[]{}/**/;2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。四、实验结果(程序)及分析#includestdio.h#includestdlib.h#includestring.h#defineN100typedefstruct{charname[30];intcode;intaddr;}token;//存储刚从文件中读取的字符typedefstruct{charname[30];intcode;}Keyword;typedefstruct{charname[30];intcode;intaddr;}symbol;Keywordkey[6]={{else,1},{if,2},{int,3},{return,4},{void,5},{where,6}};charch;//接受字符FILE*source;//源文件FILE*keytxt;//关键字输出文件FILE*badgetxt;//标识符输出文件FILE*othertxt;//其他单词输出文件FILE*number;interror_count;//错误的个数intaddr_count;//标识符表的指针intlineof;//行号tokencurrent;//暂时存放读入的字符tokenzancun;symbolcurrentsymbol;symbolsymboltable[N];//标识符表voiderror(inti);voidmain(){voidscan();error_count=0;addr_count=0;error_count=0;lineof=0;scan();}voidscan(){inti=0;voidiskeyword();//判断关键字voidisOthers()//判断其他单词voidoutput_1();//关键字输出文件voidoutput_2();//标识符输出文件voidoutput_others();//其他单词输出文件voidIszhushi();voidisnumber();if((source=fopen(Source.txt,r))==NULL){//打开源文件printf(fileopenerror/n);exit(0);}if((keytxt=fopen(key.txt,w))==NULL){//打开关键字文件printf(fileopenerror/n);exit(0);}if((badgetxt=fopen(badge.txt,w))==NULL){//打开标识符文件printf(fileopenerror/n);exit(0);}if((othertxt=fopen(others.txt,w))==NULL){printf(fileopenerror\n);exit(0);}if((number=fopen(number.txt,w))==NULL){printf(fileopenerror\n);exit(0);}ch=fgetc(source);while(ch!=EOF){for(i=0;i30;i++)current.name[i]='\0';if((ch='a'&&ch='z')||(ch='A'&&ch='Z')||ch=='_')iskeyword();if(ch=='\\')Iszhushi();if(ch='0'&&ch='9')isnumber();elseisOthers();ch=fgetc(source);}fclose(source);fclose(keytxt);fclose(badgetxt);fclose(othertxt);fclose(number);}voidiskeyword(){inti=0,k=0,j=0;inth=0;while(((ch='a')&&(ch='z'))||((ch='A')&&(ch='Z'))||ch=='_'||(ch'0'&&ch'9')){current.name[i]=ch;i++;ch=fgetc(source);}zancun=current;for(i=0;i6;i++){for(j=0;j30;j++){if(current.name[j]==key[i].name[j]){h=0;}else{h=1;break;}}if(h==0)break;}if(h==0){current.code=key[i].code;output_1();}else{strcpy(symboltable[addr_count].name,current.name);symboltable[addr_count].code=10;symboltable[addr_count].addr=addr_count;addr_count++;output_2();}}voidisOthers(){charch1;inti;for(i=0;i30;i++)current.name[i]='\0';switch(ch){case'+':{current.name[0]='+';current.code=13;current.addr=-1;output_others();break;}case'-':{current.name[0]='-';current.code=14;current.addr=-1;output_others();break;}case'*':{current.name[0]='*';current.code=15;current.addr=-1;output_others();break;}case'/':{current.name[0]='/';current.code=16;current.addr=-1;output_others();break;}case'':{ch1=fgetc(source);if(ch1=='='){current.name[0]='';current.name[1]='=';current.code=17;output_others();break;}else{fseek(source,-1,1);current.name[0]='';current.code=18;current.addr=-1;output_others();break;}}case'':{ch1=fgetc(source);if(ch1=='='){current.name[0]='';current.name[1]='=';current.code=19;output_others();break;}else{fseek(source,-1,1);current.name[0]='';current.code=20;output_others();break;}}case'=':{ch1=fgetc(source);if(ch1=='='){current.name[0]='=';current.name[1]='=';current.code=21;current.addr=-1;output_others();break;}else{current.name[0]='=';current.code=22;current.addr=-1;output_others();fseek(source,-1,1);break;}}case'!':{ch1=fgetc(source);if(ch1=='='){current.name[0]='!';current.name[1]='=';current.code=23;current.addr=-1;output_others();break;}else{fseek(source,-1,1);current.name[0]='!';current.code=24;current.addr=-1;output_others();break;}}case';':{current.name[0]=';';current.code=25;current.addr=-1;output_others();break;}case',':{current.name[0]=',';current.code=26;current.addr=-1;output_others();}case'(':{inti=ftell(source);charch1=ch;charch2;while(ch!=')'){ch=fgetc(source);}if(ch==')'){current.name[0]=ch1;current.name[1]=ch;current.code=27;current.addr=-1;output_others();fseek(source,i,0);ch2=fgetc(source);ch2=fgetc(source);break;}else{error_count++;error(1);fseek(source,i,0);ch2=fgetc(source);ch2=fgetc(source);break;}}case'{':{current.name[0]='{';current.code=28;current.addr=-1;output_others();break;}case'}':{current.name[0]='}';current.code=28;current.addr=-1;output_others();break;}case'[':{current.name[0]='[';current.code=29;current.addr=-1;output_others();break;}case']':{c
本文标题:C_minus语言词法分析器实验报告
链接地址:https://www.777doc.com/doc-2901748 .html