
编译原理-C++语言实现词法分析器设计例题参考.doc
5页一、设计内容和要求1、设计内容对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法2、设计要求利用该词法分析器完成对源程序字符串的词法分析输出形式是源程序的单词符号二元式的代码,并保存到文件中1) 假设该语言中的单词符号及种别编码如下表所示单词符号及种别编码单词符号种别编码单词符号种别编码main1[28int2]29char3{30if4}31else5,32for6:33while7;34标识符ID10>35整型常数NUM20<36=21>=37+22<=38-23==39*24!=40/25&41(26&&42)27||43 (2) 关键字main int char if else for while都是小写并都是保留字 (3)算符和界符 = + - * / & < <= > >= == != && || , : ; { } [ ] ( )ID和NUM的正规定义式为:ID→letter(letter | didit)*NUM→digit digit*letter→a | … | z | A | … | Zdigit→ 0 | … | 9如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。
空格由空白、制表符和换行符组成二、设计原理1、 符号分类程序语言的单词符号一般分为以下五种:关键字标识符常数运算符界符2、词法分析器的二元输出(单词种别,单词符号的属性值)单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种3、正规式和状态转换图三、 程序设计1 、各模块设计1.首先根据上面单词符号表及ID和NUM的正规定义式,构造出状态转换图;2.定义相关的变量和数据结构关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表如能查到匹配的单词,则该单词为关键字,否则为一般标识符关键字表为一个字符串数组,其描述如下:char KEY_WORDS[7]={″main″,″int″,″char″,″if″,″else″,″for″,″while″};用以存放单词符号二元式的数据结构可如下定义:class Word_Analyzer{public: char Content[MAXLENGTH] ; int val ; void print( );} ;3.按照编译程序一遍扫描的要求,把词法分析器Scaner作为一个独立的子程序来设计,通过对Scaner的反复调用识别出所有的单词符号;4.当Scaner识别出一个单词符号时,则将该单词符号的二元式写入到输出文件中。
若Scaner无法识别出一个单词符号时,则调用错误处理程序PrintError,显示当前扫描到的字符及其所在行、列位置,并跳过该字符重新开始识别单词符号2、 总体模块设计/*用来存储目标文件名*/string file_name;/*提取文本文件中的信息/string GetText();/*获得一个单词符号,从位置i开始查找 //并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置/string GetWord(string 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数组输出到一个文件中*/void OutFile(vector
六、参考文献《C++程序设计》 谭浩强《程序设计语言编译原理》 陈火旺5。












