当前位置:文档之家› 北邮编译原理-词法分析文档和程序

北邮编译原理-词法分析文档和程序

实验报告班级:14姓名: oneseven学号:一.题目:词法分析程序设计与实现*二.实验内容:设计并实现 C 语言的词法分析程序,要求如下。

(1) 可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。

(2) 可以识别并读取源程序中的注释。

(3) 可以统计源程序中的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果。

(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。

三.实现要求:采用C/C++作为实现语言,手工编写词法分析程序。

;四.实现功能:基本完成了实验内容中要求的所有功能。

(1)识别出源程序中的每个单词符号,并以记号的形式输出每个单词符号(2)识别并读取源程序中的注释(3) 统计源程序中的语句行数、单词个数和字符个数(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。

注:本程序未把注释中的单词符号,“”中的单词符号统计在单词个数中。

单词个数只包括了标示符,关键字,无符号数。

五.实验原理:1.词法分析程序的功能:输入源程序,输出单词符号的记号形式,如图所示:>源程序词法分析器单词符号的记号形式词法分析器2.处理过程:每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

六.代码#include<iostream>#include<fstream>—#include<string>#include <iomanip>using namespace std;string keyword[32]={"auto","break","case","char","const", .'z':case 'A'...'Z':case '_':word++;—while(isalpha(c)||isdigit(c)||c=='_'){str+=c;get();}if(c=='@'||c==''||c=='$'||c=='#'){int tag=column;】while(isalpha(c)||isdigit(c)||c=='_'||c=='@'||c==''||c=='$'||c=='#') {str+=c;get();}outf<<setw(10)<<str<<setw(30)<<"ERROR"<<setw(30)<<"错误在第"<<row<<"行第"<<tag<<"列"<<endl;str="";break;*}if(find_key(str)){outf<<setw(10)<<str<<setw(30)<<str<<setw(30)<<"关键字"<<endl;str="";}else{}outf<<setw(10)<<str<<setw(30)<<"id"<<setw(30)<<"标示符"<<endl;str="";}break;case '0'...'9':word++;while(isdigit(c)||c=='.'||c=='e'||c=='E'){:str+=c;if(c=='e'||c=='E'){get();str+=c;}get();}/if(isalpha(c)){int tag=column;while(isalpha(c)||c=='_'||isdigit(c)||c=='@'||c==''||c=='$'||c=='#') {str+=c;get();};outf<<setw(10)<<str<<setw(30)<<"ERROR"<<setw(30)<<"错误在第"<<row<<"行第"<<tag<<"列"<<endl;str="";break;}outf<<setw(10)<<str<<setw(30)<<"num"<<setw(30)<<"无符号数"<<endl;str="";break;case'>':)get();if(c=='=')outf<<setw(10)<<">="<<setw(30)<<"relop"<<setw(30)<<"关系运算符"<<endl;else if(c=='>')outf<<setw(10)<<">>"<<setw(30)<<"bit_op"<<setw(30)<<"位运算符"<<endl;else{outf<<setw(10)<<">"<<setw(30)<<"relop"<<setw(30)<<"关系运算符"<<endl; ;break;}get();break;case'<':get();if(c=='=')outf<<setw(10)<<"<="<<setw(30)<<"relop"<<setw(30)<<"关系运算符"<<endl;》else if(c=='<')outf<<setw(10)<<"<<"<<setw(30)<<"bit_op"<<setw(30)<<"位运算符"<<endl;else{outf<<setw(10)<<"<"<<setw(30)<<"relop"<<setw(30)<<"关系运算符"<<endl; break;}get();~break;case'=':get();if(c=='=')outf<<setw(10)<<"=="<<setw(30)<<"relop"<<setw(30)<<"关系运算符"<<endl;else{outf<<setw(10)<<"="<<setw(30)<<"assign_op"<<setw(30)<<"赋值符"<<endl; <break;get();break;case'!':get();if(c=='=')outf<<setw(10)<<"!="<<setw(30)<<"relop"<<setw(30)<<"关系运算符"<<endl;>else{outf<<setw(10)<<"!"<<setw(30)<<"logic_op"<<setw(30)<<"逻辑运算符"<<endl; break;}get();break;case'|':—get();if(c=='|')outf<<setw(10)<<"||"<<setw(30)<<"relop"<<setw(30)<<"逻辑运算符"<<endl;else{outf<<setw(10)<<"|"<<setw(30)<<"logic_op"<<setw(30)<<"位运算符"<<endl; break;}/get();break;case'&':get();if(c=='&')outf<<setw(10)<<"&&"<<setw(30)<<"relop"<<setw(30)<<"逻辑运算符"<<endl;else{"outf<<setw(10)<<"&"<<setw(30)<<"logic_op"<<setw(30)<<"位运算符"<<endl; break;}break;case'+':get();if(c=='+')%outf<<setw(10)<<"++"<<setw(30)<<"alg_op"<<setw(30)<<"运算符"<<endl;else if(c=='=')outf<<setw(10)<<"+="<<setw(30)<<"alg_op"<<setw(30)<<"运算符"<<endl;else{outf<<setw(10)<<"+"<<setw(30)<<"alg_op"<<setw(30)<<"运算符"<<endl; break;}<get();break;case'-':get();if(c=='-')outf<<setw(10)<<"--"<<setw(30)<<"alg_op"<<setw(30)<<"运算符"<<endl;else if(c=='=')outf<<setw(10)<<"-="<<setw(30)<<"alg_op"<<setw(30)<<"运算符"<<endl;。

相关主题