编译原理实验报告 - 词法分析器和LL文法 下载本文

最后扫描结束后输出。 五、实验结果及分析 六、实验小结和思考 通过这次实验,我对词法分析器有了进一步的了解,而且对词法分析和语法分析在实践中的应用有了深入的掌握, 让我对高级语言的学习有了更深的认识 ,了解得更透彻。 七、源程序清单

5

#include #include #include using namespace std; #define MAX 10000 struct WordString { string Word;//单词 int category;//类别 }; char *key[7] = {\,\, \, \o\, \, \, \};//关键字 WordString words[MAX]; //创建一个单词符号串 string text; //读入的文本存入text中 string word; //分割出的单词用word表示 int length; //字符个数 int k; //总单词个数 void scan() { int i,j; k=0; word=\; for(i=0;i<=length-1;i++) { if(word!=\){ if(((word[0]>='A')&&(word[0]<='Z'))||((word[0]>='a')&&(word[0]<='z')))//首字符是字母 { if(((text[i]>='A')&&(text[i]<='Z'))||((text[i]>='a')&&(text[i]<='z'))||((text[i]>=48)&&(text[i]<=57))) { word+=text[i]; } else { words[k].Word=word; for(j=0;j<7;j++) { if(words[k].Word==key[j]) { words[k].category=1;//表示关键字

6

break; } else if(j==6) words[k].category=2;//表示标识符 } k++; word=\; i--; } } else if(word[0]==','||word[0]==';'||word[0]=='{'||word[0]=='}'||word[0]=='('||word[0]==')')//首字符是界限符 { words[k].Word=word; words[k].category=5;//表示界限符 k++; word=\; i--; } else if(word[0]=='+'||word[0]=='-'||word[0]=='*'||word[0]=='/'||word[0]=='='||word[0]=='>'||word[0]=='<'||word[0]=='!')//首字符是运算符 { if(text[i]=='=') { word+=text[i]; words[k].Word=word; words[k].category=4;//表示运算符 k++; word=\; } else { words[k].Word=word; words[k].category=4;//表示运算符 k++; word=\; i--; } } else if(word[0]>=48&&word[0]<=57)//首字符是数字 { if(text[i]>=48&&text[i]<=57)

7

{ word+=text[i]; } else if((text[i]>='A'&&text[i]<='Z')||(text[i]>='a'&&text[i]<='z')) { word+=text[i]; words[k].category=6;//表示出错,标识符以数字开头 } else { words[k].Word=word; if(words[k].category!=6) words[k].category=3;//表示常数 k++; word=\; i--; } } } else { if(text[i]!=10&&text[i]!=32&&text[i]!=9) { word+=text[i]; } } } } int main() { FILE *fp; //文件指针 fp=fopen(\,\); //打开文件 if(fp==NULL) { printf(\e!\\n\); exit(0); } int i=0; while(!feof(fp)) //判断是否到文件结尾 { text+=fgetc(fp); i++;

8