/*我自己对我文件指针的理解。说明:打开文件时,有一个文件指针, 首先指向文件字符流的第一个字符,用fgetc(FILE *file)后,该指针指向下一个字符*/ #include <iostream> #include <string> #include <stdio.h> #include <ctype.h> #include "Queue.h" using namespace std; char character; string token; Queue q; //判断是否是空格 bool IsSpace(char ch) { if(isspace(ch)) return true; else return false; } //读入当前字符 void GetChar(FILE *fp,char*ch) { *ch=fgetc(fp); } //度入有效的字符,跳过空格 void GetValidChar(FILE *fp,char*ch) { GetChar(fp,ch); while(IsSpace(*ch)&&(*ch!=EOF)) { GetChar(fp,ch); } } //判断是否是标识符 bool IsLetter(char ch) { if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') return true; else return false; } //判断是否是整型 bool IsDigit(char ch) { if(ch<=57&&ch>=48) { return true; } else { return false; } } //连接两个字符 string Connection(string *str,char ch) { *str=*str+ch; return *str; } //文件指针回退,使ch为空 //fseek函数说明:改变文件指针的指向 //fseek函数参数说明:fseek(File *file,long offset,int fromwhere); //offset偏移量,fromwhere开始的位置,文件开始,当前指针位置,-1文件末尾 void Retract(FILE *fp,char*ch) { fseek(fp,-1,1); *ch=' '; } char Travel(string str) { if(str=="Const") return '0'; else if(str=="Var") return '1'; else if(str=="begin") return '2'; else if(str=="if") return '3'; else if(str=="then") return '4'; else if(str=="end") return '5'; else if(str=="else") return '6'; else if(str=="while") return '7'; else if(str=="do") return '8'; else return '9'; } void LexicalAnalysis(FILE *fp) { /*GetValidChar(fp,&character);*/ InitQueue(q,70); while(true) { GetValidChar(fp,&character); if(character==EOF) { cout<<"词法分析结束"<<endl; break; } else if(IsLetter(character))//判断是否是标识符 { token=""; Connection(&token,character); GetChar(fp,&character); while(IsLetter(character)||IsDigit(character)) { Connection(&token,character); GetChar(fp,&character); } char c=Travel(token); if(character==EOF) { if(c=='9') { cout<<"<"<<token<<","<<"标识符"<<">"<<endl; EnQueue(q,"id"); } else { cout<<"<"<<token<<","<<c<<">"<<"关键字"<<endl;//对应输出关键字的id EnQueue(q,token); } break; } else { Retract(fp,&character); if(c=='9') { cout<<"<"<<token<<","<<"标识符"<<">"<<endl; EnQueue(q,"id"); } else { cout<<"<"<<token<<","<<c<<">"<<"关键字"<<endl; EnQueue(q,token); } } } else if(IsDigit(character))//判断是否是无符号整数 { token=""; while(IsDigit(character)) { Connection(&token,character); GetChar(fp,&character); } if(character==EOF) { cout<<"<"<<token<<","<<"无符号整数"<<">"<<endl; EnQueue(q,"num"); break; } else { Retract(fp,&character); cout<<"<"<<token<<","<<"无符号整数"<<">"<<endl; EnQueue(q,"num"); } } else if(character=='+')//判断是否是运算符 { cout<<"<"<<character<<","<<"运算符"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='-') { cout<<"<"<<character<<","<<"运算符"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='*') { cout<<"<"<<character<<","<<"运算符"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='/') { cout<<"<"<<character<<","<<"运算符"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='=') { cout<<"<"<<character<<","<<"运算符"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='>')//>=运算符必须连在一起,否则按出错处理 { token=""; Connection(&token,character); GetChar(fp,&character); if(character=='=') { Connection(&token,character); cout<<"<"<<token<<","<<"运算符"<<">"<<endl; EnQueue(q,token); } else if(character==EOF) { cout<<"<"<<token<<","<<"运算符"<<">"<<endl; EnQueue(q,token); break; } else { Retract(fp,&character); cout<<"<"<<token<<","<<"运算符"<<">"<<endl; EnQueue(q,token); } } else if(character=='<') { token=""; Connection(&token,character); GetChar(fp,&character); if(character=='=') { Connection(&token,character); cout<<"<"<<token<<","<<"运算符"<<">"<<endl; EnQueue(q,token); } else if(character==EOF) { cout<<"<"<<token<<","<<"运算符"<<">"<<endl; EnQueue(q,token); break; } else { Retract(fp,&character); cout<<"<"<<token<<","<<"运算符"<<">"<<endl; EnQueue(q,token); } } else if(character==',')//判断是否是标点符号 { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character==':') { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character==';') { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='(') { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character==')') { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='{') { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else if(character=='}') { cout<<"<"<<character<<","<<"标点符号"<<">"<<endl; token=""; token+=character; EnQueue(q,token); } else { token=""; cout<<"含有非法符"<<endl; } } }} int main() { FILE *fp; char ch; fp=fopen("1.txt","r"); LexicalAnalysis(fp); fclose(fp); cin>>ch; return 0; }