《2022年编译课程方案报告——词法分析器》由会员分享,可在线阅读,更多相关《2022年编译课程方案报告——词法分析器(12页珍藏版)》请在金锄头文库上搜索。
1、个人资料整理仅限学习使用课程设计任务书目录引言.4第一章概述 .51.1 设计内容 .51.2 设计要求 .5第二章设计的基本原理 .6 2.1.62.2.6第三章程序设计 .73.1 总体方案设计 .73.2 各模块设计 .8第四章程序测试 .94.1 一般测试4.2 出错处理测试第五章结论 .10参考文献.10附录程序清单.11精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 12 页个人资料整理仅限学习使用引言编译原理是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构
2、、工作流程及编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计算法,因此,一直是一门比较难学的课程。为了使学生更好地理解和掌握编译技术的基本概念、基本原理和实现方法,实践环节非常重要,只有通过上机进行程序设计,才能使学生对比较抽象的教案内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词
3、规则识别单词( 也称单词符号或符号。词法分析程序实现这个任务。词法分析程序可以使用Lex 等工具自动生成。从左到右逐个字符对构成源 程 序 的 字 符 串 进 行 扫 描 , 依 据 词 法 规 则 , 识 别 出 一 个 一 个 的 标 记 假设该语言中的单词符号及种别编码如下表所示。单词符号及种别编码单词符号种别编码单词符号种别编码main 1 28 int 2 29 char 3 30 if 4 31 else 5 , 32 for 6 : 33 while 7 ;34 标识符 ID 10 35 整型常数NUM 20 36 = 21 37 + 22 38 - 23 39 * 24 !40
4、 / 25 & 41 ( 26 & 42 27 | 43 (2 关键字 main int char if else for while都是小写并都是保留字。算符和界符 =+ * / & !& | , : 。 ( ID和NUM 的正规定义式为:IDletter(letter | didit* NUM digit digit* lettera| | z | A | | Zdigit 0 | | 9如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 12 页个人资料整理仅限学习使用用一
5、个空格作间隔。空格由空白、制表符和换行符组成。第二章 设计原理2.1 符号分类程序语言的单词符号一般分为以下五种:关键字标识符常数运算符界符2.2. 词法分析器的二元输出。/*获得一个单词符号 ,从位置 i开始查找。/并且有一个引用参数 j,用来返回这个单词最后一个字符在str的位置。 */ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 12 页个人资料整理仅限学习使用string GetWord(string str,int i,int& j 。/*这个函数用来除去字符串中连续的空格和换行int DeleteNull(string
6、str,int i 。/*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i。/*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i。/*此函数将一个 pair数组输出到一个文件中 */ void OutFile(vectorpair v 。/*此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组 */ vectorpair analyst(vector vec。/*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回
7、假*/ bool IsKey(string str。3.2 各模块设计1.首先根据上面单词符号表及ID和NUM的正规定义式,构造出状态转换图;2.定义相关的变量和数据结构。关键字作为特殊标识符处理,把它们预先安排在一张表格中 。 。3.按照编译程序一遍扫描的要求,把词法分析器Scaner 作为一个独立的子程序来设计,通过对 Scaner 的反复调用识别出所有的单词符号;4.当Scaner 识别出一个单词符号时,则将该单词符号的二元式写入到输出文件中。若Scaner 无法识别出一个单词符号时,则调用错误处理程序PrintError,显示当前扫描到的字符及其所在行、列位置,并跳过该字符重新开始识别
8、单词符号。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 12 页个人资料整理仅限学习使用第四章 程序测试4.1 正常测试测试该设计词法分析器,可对下面的源程序进行词法分析: main( int i = 10。while(i i = i - 1 。 输出如下二元式代码序列:(1,main (26,(27,(30, (2,int(10,i(21,=(20,10(34,。(7,while(26,(10,i(27,(10,i(21, =(10,i(23,-(20,1(34,。(31,第五章 结论该词法分析器功能良好,可以完成预定的要求。参考文
9、献:程序设计语言编译原理陈火旺C+ 程序设计谭浩强程序清单:#include #include 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 12 页个人资料整理仅限学习使用#include #include using namespace std。/* 用来存储目标文件名*/ string file_name。/* 提取文本文件中的信息。*/ string GetText(。/* 获得一个单词符号, 从位置 i 开始查找。/ 并且有一个引用参数j ,用来返回这个单词最后一个字符在str的位置。 */ string GetWord(s
10、tring str,int i,int& j。/* 这个函数用来除去字符串中连续的空格和换行/ 第一个参数为目标字符串,第二个参数为开始位置/ 返回值为连续的空格和换行后的第一个有效字符在字符串的位置*/ int DeleteNull(string str,int i。/* 判断 i 当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i。/* 判断 i 当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i。/* 此函数将一个pair数组输出到一个文件中*
11、/ void OutFile(vectorpair v。/* 此函数接受一个字符串数组,对它进行词法分析,返回一个pair 型数组 */ vectorpair analyst(vector vec。/* 此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/ bool IsKey(string str。int main( string com1= 。 string com2=n。 string fileline=GetText(。 int begin=0,end=0。 vector array。 do begin=DeleteNull(fileline,begin。 string n
12、owString。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 12 页个人资料整理仅限学习使用 nowString=GetWord(fileline,begin,end。 if(end=-1 break。 if(nowSpare(com1&nowSpare(com2 array.push_back(nowString。 begin=end+1。 while(true。 vectorpair mid_result。 mid_result=analyst(array。 OutFile(mid_result。 cout*n。 cout*程
13、序已完成词法分析,分析结果已经存储在文件file_name中! *n。 cout。 return 0。 /* 提取文本文件中的信息*/ string GetText( string file_name1。 cout请输入源文件名 file_name1。 ifstream infile(file_name1.c_str(,ios:in。 if (!infile cerr无法打开文件 ! !。 cout。 infile.close(。 return f。 /* 获得一个单词符号, 从位置 i 开始查找。/ 并且有一个引用参数j ,用来返回这个单词最后一个字符在原字符串的位置。*/ string G
14、etWord(string str,int i,int& j string no_use( , 。n+=*/-。 j=str.find_first_of(no_use,i。 if(j=-1 return 。 if(i!=j j-。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 12 页个人资料整理仅限学习使用 return str.substr(i,j-i+1。 /* 这个函数用来除去字符串中连续的空格和换行/ 第一个参数为目标字符串,第二个参数为开始位置/ 返回值为连续的空格和换行后的第一个有效字符在字符串的位置*/ int Dele
15、teNull(string str,int i for(。 i+ if(stri!= &stri!=n return i。 /* 判断 i 当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i int t。 char arr7=,。,(,。 for (t=0。t if(stri=arrt return true。 return false。 /* 判断 i 当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i int t。 char arr7=+,-,*
16、,/,=,。 for (t=0。t if(stri=arrt return true。 return false。 /* 此函数将一个个字符串数组输出到一个文件中*/ void OutFile(vectorpair v cout请输入目标文件名file_name。 ofstream outfile(file_name.c_str(,ios:out。 if (!outfile cerr无法打开文件 ! !。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 12 页个人资料整理仅限学习使用 coutendl。 int i。 for(i=0
17、。i。i+ outfilevi.first , vi.secondendl。 outfile。 return。 /* 此函数接受一个字符串数组,对它进行词法分析,返回一个pair 型数组 */ vectorpair analyst(vector vec vectorpair temp。 int i。 for(i=0。i。i+ if(veci.size(=1 if(veci=|veci=&veci+1= string jk=veci。 jk.append(vec+i,0,1。pair pp(4,jk。 temp.push_back(pp。continue 。 if(veci=+&veci+1=+
18、|(veci=-&veci+1=- string jk=veci。 jk.append(vec+i,0,1。 pair pp(4,jk。temp.push_back(pp 。 continue。 if(IsBoundary(veci,0 pair pp(5,veci。 temp.push_back(pp。 else if(IsOperation(veci,0 pair pp(4,veci。 temp.push_back(pp。 else if(veci0=0 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 12 页个人资料整理仅限学习
19、使用 pair pp(3,veci。 temp.push_back(pp。 else pair pp(2,veci。 temp.push_back(pp。 else if(veci0=0 pair pp(3,veci。 temp.push_back(pp。 else if(IsKey(veci pair pp(1,veci。 temp.push_back(pp。 else pair pp(2,veci。 temp.push_back(pp。 return temp。 /* 此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/ bool IsKey(string str string p16=char,double,int,long,double,float,for,while,do,break,continue,switch,short,case,return,if。vector ppp(p,p+16。int u。for(u=0 。u。u+ if(!pare(pppu return true。return false。 /*finished*/ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 12 页