logo资料库

一个C++编写的简单的词法分析器.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
实验一 词法分析 开始 忽略空白 是标识符 标识符分析 是常数 常数分析 界符算符分析 返回 是界符或 算符 出错处理 1. 词法分析程序源代码 #include #include #include #include using namespace std; const int MLength=255; //一行允许的字符个数 union WordContent{ char T1[MLength]; int T2; char T3[3]; //存放单词符号的内容 //存放标识符 //存放整型常数的拼数 //存放其他符号 }; struct Word { //单词符号二元式 int code; //存放种别编码
WordContent value; }; int Ln=1,Col=1; char *KeyWord[7]={"main","int","char","if","else","for","while"}; //字符的位置(行,列) //关键字表 bool TestID(char *&ch); bool TestNumber(char *&ch); bool TestSign(char *&ch); void TestKeyWord(char word[MLength],int &code); bool WordScan(char *&ch); void PrintError(char *&ch); Word word; //声明一个单词变量 //词法分析 //错误处理 //测试标识符 //测试整型常数 //测试界符和算符 //测试关键字 int main() { char program[MLength*10]; int i=0; cout<<"请输入一段程序并以‘#’结束:"<
cout<<"词法分析结果:"<64 && *ch<91) || (*ch>96 && *ch<123) || (*ch>47 &&
*ch<58)) ); str.T1[k]='\0'; return 1; } bool TestNumber(char *&ch) { WordContent number; word.value=str; word.code=10; TestKeyWord(word.value.T1,word.code); //标识符编号为 10 //测试关键字 //测试整型常数 number.T2=atoi(ch); while(*ch>47 && *ch<58) //拼数 ch++;Col++; //移向下一个字符 word.value=number; word.code=20; return 1; } bool TestSign(char *&ch) { int code; char ch1='\0',ch2='\0'; WordContent sign; switch(*ch) { case '=': //整形常数编号为 20 //测试界符和算符 //识别界符或算符 ch1='=';code=21; ch++;Col++; if(*ch=='=') {ch2='=';code=39;} else ch--;Col--; break; case '+': ch1='+';code=22;break; case '-': ch1='-';code=23;break;
case '*': ch1='*';code=24;break; case '/': ch1='/';code=25;break; case '(': ch1='(';code=26;break; case ')': ch1=')';code=27;break; case '[': ch1='[';code=28;break; case ']': ch1=']';code=29;break; case '{': ch1='{';code=30;break; case '}': ch1='}';code=31;break; case ',': ch1=',';code=32;break; case ':': ch1=':';code=33;break; case ';': ch1=';';code=34;break; case '>': ch1='>';code=35; ch++;Col++; if(*ch=='=') {ch2='=';code=37;} else ch--;Col--; break; case '<': ch1='<';code=36; ch++;Col++; if(*ch=='=') {ch2='=';code=38;} else ch--;Col--; break; case '!': ch1='!'; ch++;Col++; if(*ch=='=') {ch2='=';code=40;} else return 0; break; //遇到无法识别字符 case '&': ch1='&';code=41; ch++;Col++; if(*ch=='&') {ch2='&';code=42;}
else ch--;Col--; break; case '|': ch1='|';code=43; ch++;Col++; if(*ch=='|') {ch2='|';code=44;} else ch--;Col--; //遇到无法识别字符 //移向下一个字符 break; default: return 0; } ch++;Col++; sign.T3[0]=ch1; sign.T3[1]=ch2; sign.T3[2]='\0'; word.code=code; word.value=sign; return 1; } void TestKeyWord(char word[MLength],int &code) { //测试关键字 int s=0; for(int i=0;i<7 && s==0;i++) { if(strcmp(word,KeyWord[i])==0) { code=i+1; s=1; } } } bool WordScan(char *&ch) { //词法分析
int result=0; bool Unblank=0; while(Unblank!=1) { //分析结果 //非空白 //忽略空白 //是空格 if(*ch==32) {ch++;Col++;} else if(*ch==9) {ch++;Col+=4;} else if(*ch==10) {ch++;Ln++;Col=1;} else Unblank=1; //是 tab 制表符 //是换行符 } if((*ch>64 && *ch<91) || (*ch>96 && *ch<123)) //判断标识符 result=TestID(ch); else if(*ch>47 && *ch<58) result=TestNumber(ch); else result=TestSign(ch); //判断整型常数 //判断算符和界符 if(result!=1) return 0; return 1; } void PrintError(char *&ch) { //输出错误 cout<<"输入无法识别字符!"; cout<<"位置 Ln:"<
(注:因为词法分析器无法识别“!<”,即不小于运算符,所以出现错误。)
分享到:
收藏