词法分析器实验

    技术2022-07-11  156

    词法分析程序

    一、实验目的

    通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

    编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的类型码及单词符号的自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

    二、实验要求

    本实验要求:①要求能熟练使用C或C++程序设计语言编程;②在上机之前要有详细的设计报告;③要编写出完成相应任务的程序并在计算机上准确地运行;完成一个简单的词法分析程序;④实验结束后要写出上机实验报告。

    三、实验内容

    #include #include <stdlib.h> #include <stdio.h> using namespace std; //关键字 string KEYWORD[15]={“if”,“else”,“void”,“return”,“while”,“then”,“for”,“do”, “int”,“char”,“double”,“float”,“case”,“cin”,“cout”}; char SEPARATER[8]={’;’,’,’,’{’,’}’,’[’,’]’,’(’,’)’}; //分隔符 char OPERATOR[8]={’+’,’-’,’’,’/’,’>’,’<’,’=’,’!’}; //运算符 char FILTER[4]={’ ‘,’\t’,’\r’,’\n’}; //过滤符 const int IDENTIFIER=100; //标识符值 const int CONSTANT=101; //常数值 const int FILTER_VALUE=102; //过滤字符值 /判断是否为关键字/ bool IsKeyword(string word){ for(int i=0;i<15;i++){ if(KEYWORD[i]==word){ return true; } } return false;} /判断是否为分隔符/ bool IsSeparater(char ch){ for(int i=0;i<8;i++){ if(SEPARATER[i]==ch){ return true; } } return false; } /判断是否为运算符/ bool IsOperator(char ch){ for(int i=0;i<8;i++){ if(OPERATOR[i]ch){ return true; } } return false; } /判断是否为过滤符/ bool IsFilter(char ch){ for(int i=0;i<4;i++){ if(FILTER[i]ch){ return true; } } return false; } /判断是否为大写字母/ bool IsUpLetter(char ch) { if(ch>=‘A’ && ch<=‘Z’) return true; return false;} /判断是否为小写字母/ bool IsLowLetter(char ch){ if(ch>=‘a’ && ch<=‘z’) return true; return false;} /判断是否为数字/ bool IsDigit(char ch){ if(ch>=‘0’ && ch<=‘9’) return true; return false;} /返回每个字的值/ template int value(T *a,int n,T str){ for(int i=0;i<n;i++){ if(a[i]str) return i+1; } return -1;} /词法分析/ void analyse(FILE * fpin){ char ch=’ '; string arr=""; while((ch=fgetc(fpin))!=EOF){ arr=""; if(IsFilter(ch)){} //判断是否为过滤符 else if(IsLowLetter(ch)){ //判断是否为关键字 while(IsLowLetter(ch)){ arr += ch; ch=fgetc(fpin); } //fseek(fpin,-1L,SEEK_CUR); if(IsKeyword(arr)){ printf("= “,value(KEYWORD,15,arr)); cout<<arr<<” 关键字"<<endl; } else { printf("= “,IDENTIFIER); cout<<arr<<” 标识符"<<endl; } } else if(IsDigit(ch)) { //判断是否为数字 while(IsDigit(ch)||(ch’.’&&IsDigit(fgetc(fpin)))) { arr += ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); printf("= “,CONSTANT); cout<<arr<<” 整形数"<<endl; } else if(IsUpLetter(ch)||IsLowLetter(ch)||ch’_’){ while(IsUpLetter(ch)||IsLowLetter(ch)||ch’_’||IsDigit(ch)) { arr += ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); printf("= “,CONSTANT); cout<<arr<<” 标识符"<<endl; } else switch(ch){ case ‘+’: case ‘-’: case '’: case ‘/’: case ‘>’: case ‘<’: case ‘=’: case ‘!’: { arr += ch; printf("= “,value(OPERATOR,8,*arr.data())); cout<<arr<<” 运算符"<<endl; break; } case ‘;’: case ‘,’: case ‘(’: case ‘)’: case ‘[’: case ‘]’: case ‘{’: case ‘}’: { arr += ch; printf("= “,value(SEPARATER,8,*arr.data())); cout<<arr<<” 分隔符"<<endl; break; } default :cout<<"""<<ch<<"":无法识别的字符!"<<endl; } } } int main(){ char inFile[40]; FILE *fpin; cout<<“请输入源文件路径:”; while(true){ cin>>inFile; if((fpin=fopen(inFile,“r”))!=NULL) break; else{ cout<<“文件名错误!”<<endl; cout<<“请输入源文件路径:”; } } cout<<"------词法分析如下------"<<endl; analyse(fpin); return 0; }

    四、实验结果 文件流输入; int main(){ int x; scanf("%d",&x); printf(“hahahahha”\n); return 0; } 结果: 文件流输入 var b,c; int a,b;

    文件流输入: float a=3.0; double b=4.0; double c; c=a+b;

    文件输入: main(){ int a,b,c,temp=0; scanf("%d",&a); if(a>=3){ a++; temp=1; } while(temp=1){ c=a+b; b++;} printf("%d",a,b); return 0;}

    输入: main(){ int a,b; b+=20; c=%@; return 0; } 实验小结: 在实验中遇到很多错误,先开始本来想着设计一个界面把那些关键字和符号的标记数字用界面显示出来,但是发现感觉有点难,放弃了,先开始在做出来的时候忽略了一些可能出现的语法错误,后面通过慢慢改正,可是实现当出现了不能识别的单词时显示error.

    Processed: 0.014, SQL: 9