#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<ctype.h> using namespace std; map<string,char *> key; map<char,char *> ssym; void scanner(FILE *fp) { char word[20]={‘\0‘}; char ch; int i,c,k,flag; ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符 if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))) { k=0; word[k++]=ch; ch=fgetc(fp); while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||(ch>=‘0‘&&ch<=‘9‘)) { word[k++]=ch; ch=fgetc(fp); } word[k]=‘\0‘; fseek(fp,-1,1); flag=1; for(i=0;i<9;i++) { if(key[word]!=NULL) { printf("%20s\t\t%s\n\n",word,key[word]); flag=0; break; } } if(flag) printf("%20s\t\t标示符\n\n",word); } else { if(ch>=‘0‘&&ch<=‘9‘) { k=0; word[0]=ch; ch=fgetc(fp); while(ch>=‘0‘&&ch<=‘9‘) { word[k++]=ch; ch=fgetc(fp); } word[k]=‘\0‘; fseek(fp,-1,1); printf("%20s\t\t无符号实数\n\n",word); } else { word[0]=ch; switch(ch){ case‘[‘: case‘]‘: case‘(‘: case‘)‘: case‘{‘: case‘}‘: case‘,‘: case‘"‘: case‘;‘:printf("%20s\t\t界符%s\n\n",word,ssym[word[0]]);break; case‘+‘:ch=fgetc(fp); word[1]=ch; if(ch==‘=‘){ printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]);//运算符“+=” } else if(ch==‘+‘){ printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“++” } else { fseek(fp,-1,1); printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“+” } break; case‘-‘:ch=fgetc(fp); word[1]=ch; if(ch==‘=‘){ printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); } else if(ch==‘-‘){ printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“--” } else { fseek(fp,-1,1); printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“-” } break; case‘*‘: case‘/‘: case‘!‘: case‘=‘:ch=fgetc(fp); if(ch==‘=‘){ printf("%20s\t\t运算符\n\n",word); } else { fseek(fp,-1,1); printf("%20s\t\t运算符\n\n",word); } break; case‘<‘:ch=fgetc(fp); word[1]=ch; if(ch==‘=‘){ printf("%20s\t\t运算符\n\n",word); //判断结果为运算符“<=” } else if(ch==‘<‘){ printf("%20s\t\t运算符\n\n",word); //判断结果为“<<” } else { fseek(fp,-1,1); printf("%20s\t\t运算符\n\n",word); //判断结果为“<” } break; case‘>‘:ch=fgetc(fp); word[1]=ch; if(ch==‘=‘) printf("%20s\t\t运算符\n\n",word); else { fseek(fp,-1,1); printf("%20s\t\t运算符\n\n",word); } break; case‘%‘:ch=fgetc(fp); word[1]=ch; if(ch==‘=‘){printf("%20s\t\t运算符\n\n",word);} if(ch>=‘a‘&&ch<=‘z‘) printf("%20s\t\t类型标识符\n\n",word); else { fseek(fp,-1,1); printf("%20s\t\t取余运算符\n\n",word); } break; default:printf("无法识别字符!\n\n"); break; } } } } void init() { int i; for(i=0;i<=255;i++) ssym[i]=""; ssym[‘+‘]="plus"; ssym[‘-‘]="minus"; ssym[‘*‘]="times"; ssym[‘/‘]="slash"; ssym[‘(‘]="lparen"; ssym[‘)‘]="rparen"; ssym[‘=‘]="eql"; ssym[‘,‘]="comma"; ssym[‘.‘]="period"; ssym[‘#‘]="neq"; ssym[‘;‘]="semicolon"; key["main"]="关键字主函数"; key["void"]="关键字空"; key["int"]="关键字整形"; key["char"]="关键字字符型"; key["printf"]="关键字打印"; key["scanf"]="关键字输入"; key["else"]="关键字条件语句"; key["if"]="关键字条件语句"; key["return"]="关键字返回"; } int main() { char in_fn[30];//文件路径 char ch; init(); FILE *fp; printf("\n请输入源文件路径:"); while(1) { gets(in_fn); if((fp=fopen(in_fn,"r"))!=NULL) break; else printf("文件路径错误!请重新输入:"); } printf("\n词法分析结果如下:\n"); do { ch=fgetc(fp); if(ch==‘#‘) break;//文件以#结尾,作为扫描结束条件 else if(ch==‘ ‘||ch==‘\t‘||ch==‘\n‘){} //忽略空格,空白,和换行 else { fseek(fp,-1,1);//回退一个字节开始识别单词流 scanner(fp); } }while(ch!=‘#‘); return 0; }
原文:http://blog.csdn.net/u011032846/article/details/24320883