1、通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序。2.检测代码分析1、Hello World简单程序输入:2、较复杂程序输入:3. 异常程序输入检测三, 源代码#include cctypestringvectorcstdiocstdlibcstringfstreamiostreamalgorithmusing namespace std;const int FILENAME=105;const int MAXBUF=82;const int L_END=40;const int R_END=81;const int START=0; /开始指针vector Key; /C保留的关
2、键字表class funtion /词法分析结构public: /变量声明 char filenameFILENAME; /需要词法分析的代码文件名 ifstream f_in; char bufferMAXBUF; /输入缓冲区 int l_end, r_end, forward; /左半区终点,右半区终点,前进指针, bool l_has, r_has; /辅助标记位,表示是否已经填充过缓冲区 vector Id; /标识符表 char C; /当前读入的字符 int linenum, wordnum, charnum; /行数,单词数,字符数 string curword; /存放当前的
3、字符串 /函数声明 void get_char(); /从输入缓冲区读一个字符,放入C中,forward指向下一个 void get_nbc(); /检查当前字符是否为空字符,反复调用直到非空 void retract(); /向前指针后退一位 void initial(); /初始化要词法分析的文件 void fillBuffer(int pos); /填充缓冲区,0表示左,1表示右 void analyzer(); /词法分析 void token_table(); /以记号的形式输出每个单词符号 void note_print(); /识别并读取源程序中的注释 void count_nu
4、mber(); /统计源程序汇总的语句行数、单词个数和字符个数 void error_report(); /检查并报告源程序中存在的所有错误 void solve(char* file); /主调用函数;void welcome() printf(n*n); printf( * Welcome to use LexicalAnalyzer *n* By schnee BUPT Date: 2011/20/10 *n*nnnvoid initKey() Key.clear(); Key.push_back(autobreakcasecharconstcontinueKey.push_back(d
5、efaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticsizeofstructswitchtypedefunionunsignedvoidvolatilewhilevoid funtion:get_char() C=bufferforward; if(C=EOF)return ; /结束 if(C=n)linenum+; /统计行数和字符数 else if(isalnum(C) charnum+; forward+; if(bufferforward=EOF) if(forward=l_e
6、nd) fillBuffer(1); forward+; else if(forward=r_end) fillBuffer(0); forward=START; get_nbc() while(C= | C=t0) get_char();initial(char* file) Id.clear(); /清空标识符表 l_end=L_END;r_end=R_END; /初始化缓冲区 forward=0; l_has=r_has=false; bufferl_end=bufferr_end=EOF; fillBuffer(0); linenum=wordnum=charnum=0; /初始化行数
7、,单词数,字符数fillBuffer(int pos) if(pos=0)/填充缓冲区的左半边 if(l_has=false) fin.read(buffer, l_end); if(fin.gcount()!=l_end) bufferfin.gcount()=EOF; else l_has=false; else /填充缓冲区的右半边 if(r_has=false) fin.read(buffer+l_end+1, l_end); bufferfin.gcount()+l_end+1=EOF; else r_has=false;retract() if(forward=0) l_has=t
8、rue; /表示已经读取过文件,避免下次再次读取 forward=l_end-1; else forward-; r_add=true; forward-;analyzer() FILE *token_file, *note_file, *count_file, *error_file; token_file=fopen(token_file.txt, w note_file=fopen(note_file.txt count_file=fopen(count_file.txt error_file=fopen(error_file.txt int i; curword.clear(); ge
9、t_char(); get_nbc(); if(C=EOF)return false; if(isalpha(C) | C=_)/关键字和标识符的处理,以字母或下划线开头 curword.clear(); while(isalnum(C) | C= curword.push_back(C); get_char(); retract(); wordnum+; Id.push_back(curword); for(i=0; iKey.size(); i+) if(Keyi=curword) break; /输出每一个单词的标识符 if(iKey.size() /关键字 fprintf(token_file, %8d-%20s %sn, wordnum, KEY WORD, curword); elseIdentifier else if(isdigit(C)/无符号数的处理 while(isdigit(C)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1