第五次作业
词法分析程序(Lexical Analyzer)要求:
- 从左至右扫描构成源程序的字符流
- 识别出有词法意义的单词(Lexemes)
- 返回单词记录(单词类别,单词本身)
- 滤掉空格
- 跳过注释
- 发现词法错误
程序结构:
输入:字符流(什么输入方式,什么数据结构保存)
处理:
–遍历(什么遍历方式)
–词法规则
输出:单词流(什么输出形式)
–二元组
单词类别:
1.标识符(10)
2.无符号数(11)
3.保留字(一词一码)
4.运算符(一词一码)
5.界符(一词一码)
1 #include <iostream> 2 #include <stdlib.h> 3 #include <stdio.h> 4 5 using namespace std; 6 string KEYWORD[15]={"if","else","void","return","while","then","for","do", 7 "int","char","double","float","case","cin","cout"}; 8 char SEPARATER[10]={';',',','{','}','[',']','(',')','#','"'}; 9 char OPERATOR[9]={'+','-','*','/','>','<','=','!','%'}; 10 char FILTER[4]={' ','\t','\r','\n'}; 11 const int IDENTIFIER=100; 12 const int CONSTANT=101; 13 const int FILTER_VALUE=102; 14 15 16 17 bool IsKeyword(string word){ 18 for(int i=0;i<15;i++){ 19 if(KEYWORD[i]==word){ 20 return true; 21 } 22 } 23 return false; 24 } 25 26 bool IsSeparater(char ch){ 27 for(int i=0;i<10;i++){ 28 if(SEPARATER[i]==ch){ 29 return true; 30 } 31 } 32 return false; 33 } 34 35 36 bool IsOperator(char ch){ 37 for(int i=0;i<9;i++){ 38 if(OPERATOR[i]==ch){ 39 return true; 40 } 41 } 42 return false; 43 } 44 45 bool IsFilter(char ch){ 46 for(int i=0;i<4;i++){ 47 if(FILTER[i]==ch){ 48 return true; 49 } 50 } 51 return false; 52 } 53 54 bool IsUpLetter(char ch){ 55 if(ch>='A' && ch<='Z') return true; 56 return false; 57 } 58 59 bool IsLowLetter(char ch){ 60 if(ch>='a' && ch<='z') return true; 61 return false; 62 } 63 64 bool IsDigit(char ch){ 65 if(ch>='0' && ch<='9') return true; 66 return false; 67 } 68 69 template <class T> 70 int value(T *a,int n,T str){ 71 for(int i=0;i<n;i++){ 72 if(a[i]==str) return i+1; 73 } 74 return -1; 75 } 76 77 void analyse(FILE * fpin){ 78 char ch=' '; 79 string arr=""; 80 while((ch=fgetc(fpin))!=EOF){ 81 arr=""; 82 if(IsFilter(ch)){} 83 else if(IsLowLetter(ch)){ 84 while(IsLowLetter(ch)){ 85 arr += ch; 86 ch=fgetc(fpin); 87 } 88 //fseek(fpin,-1L,SEEK_CUR); 89 if(IsKeyword(arr)){ 90 printf("%3d ",value(KEYWORD,15,arr)); 91 cout<<arr<<" 保留字"<<endl; 92 } 93 else 94 { 95 printf("%3d ",IDENTIFIER); 96 cout<<arr<<" 标识符"<<endl; 97 } 98 } 99 else if(IsDigit(ch)){ //判断是否为数字 100 while(IsDigit(ch)||(ch=='.'&&IsDigit(fgetc(fpin)))){ 101 arr += ch; 102 ch=fgetc(fpin); 103 } 104 fseek(fpin,-1L,SEEK_CUR); 105 printf("%3d ",CONSTANT); 106 cout<<arr<<" 无符号数"<<endl; 107 } 108 else if(IsUpLetter(ch)||IsLowLetter(ch)||ch=='_'){ 109 while(IsUpLetter(ch)||IsLowLetter(ch)||ch=='_'||IsDigit(ch)){ 110 arr += ch; 111 ch=fgetc(fpin); 112 } 113 fseek(fpin,-1L,SEEK_CUR); 114 printf("%3d ",CONSTANT); 115 cout<<arr<<" 标识符"<<endl; 116 } 117 else switch(ch){ 118 case '+': 119 case '-': 120 case '*': 121 case '/': 122 case '>': 123 case '<': 124 case '=': 125 case '!': 126 case '%': 127 { 128 arr += ch; 129 printf("%3d ",value(OPERATOR,8,*arr.data())); 130 cout<<arr<<" 运算符"<<endl; 131 break; 132 } 133 case ';': 134 case ',': 135 case '(': 136 case ')': 137 case '[': 138 case ']': 139 case '{': 140 case '}': 141 case '#': 142 case '"': 143 { 144 arr += ch; 145 printf("%3d ",value(SEPARATER,10,*arr.data())); 146 cout<<arr<<" 界符"<<endl; 147 break; 148 } 149 default :cout<<"\""<<ch<<"\":无法识别的字符!"<<endl; 150 } 151 } 152 153 } 154 int main() 155 { 156 char inFile[40]; 157 FILE *fpin; 158 cout<<"请输入源文件名(包括路径和后缀):"; 159 while(true){ 160 cin>>inFile; 161 if((fpin=fopen(inFile,"r"))!=NULL) 162 break; 163 else{ 164 cout<<"文件名错误!"<<endl; 165 cout<<"请输入源文件名(包括路径和后缀):"; 166 } 167 168 } 169 cout<<"------词法分析如下------"<<endl; 170 analyse(fpin); 171 return 0; 172 }
这代码参考网上同学的。只能做到这里了
转自宋思康。

浙公网安备 33010602011771号