1、三、程序设计1.总体模块设计/*用来存储目标文件名*/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当前
2、所指的字符就是否为一个运算符,就是的话返回真,反之假*/bool IsOperation(string str,int i);/*此函数将一个pair数组输出到一个文件中*/void OutFile(vectorpair v);/*此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组*/vector analyst(vector vec);/*此函数判断传递的参数就是否为关键字,就是的话,返回真,反之返回假*/bool IsKey(string str);2.各模块设计(1)、首先根据上面单词符号表及ID与NUM的正规定义式,构造出状态转换图;(2)、定义相关的变量与数据结构。关
3、键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:char KEY_WORDS7=main,int,char,if,else,for,while;用以存放单词符号二元式的数据结构可如下定义:class Word_Analyzerpublic: char ContentMAXLENGTH ; int val ; void print(); ;(3)、按照编译程序一遍扫描的要求,把词法分析器Scaner作为一个独立的子程序来设计,通过对Scaner的
4、反复调用识别出所有的单词符号;(4)、当Scaner识别出一个单词符号时,则将该单词符号的二元式写入到输出文件中。若Scaner无法识别出一个单词符号时,则调用错误处理程序PrintError,显示当前扫描到的字符及其所在行、列位置,并跳过该字符重新开始识别单词符号。四、程序代码#include #include fstream using namespace std; /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。 string GetText(); /*获得一个单词符号,从位置i开始查找。 /并且有一个引用参数j,用来返回这个单词最后一个字符在s
5、tr的位置。 string GetWord(string str,int i,int& /*这个函数用来除去字符串中连续的空格与换行 /第一个参数为目标字符串,第二个参数为开始位置 /返回值为连续的空格与换行后的第一个有效字符在字符串的位置*/ int DeleteNull(string str,int i); /*判断i当前所指的字符就是否为一个分界符,就是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符就是否为一个运算符,就是的话返回真,反之假*/ bool IsOperation(string str,int i);
6、/*此函数将一个pair数组输出到一个文件中*/ void OutFile(vector /*次函数将参数str,digit添加到temp中*/ void add(string str,int digit,vector temp); /*此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组*/ vector /*此函数判断传递的参数就是否为关键字,就是的话,返回真,反之返回假*/ bool IsKey(string str); int main() cout*n; cout*编译原理课程设计-词法编译器ver 1、0*n coutendl; string com1= string
7、 com2=n string fileline=GetText(); int begin=0,end=0; array; do begin=DeleteNull(fileline,begin); string nowString; nowString=GetWord(fileline,begin,end); if(end=-1) break; if(nowString、compare(com1)&nowString、compare(com2) array、push_back(nowString); begin=end+1; while(true); mid_result; mid_result
8、=analyst(array); OutFile(mid_result);*程序已完成词法分析,分析结果已经存储在文件file_namefile_name1; ifstream infile(file_name1、c_str(),ios:in); if (!infile) cerr无法打开文件!file_name1、c_str() ! exit(-1); char f1000; infile、getline(f,1000,EOF); infile、close(); printf(f); return f; /并且有一个引用参数j,用来返回这个单词最后一个字符在原字符串的位置。 j) strin
9、g no_use() , ;n+=*/- j=str、find_first_of(no_use,i); if(j=-1) return if(i!=j) j-; return str、substr(i,j-i+1); /第一个参数为目标字符串,第二个参数为开始位置 /返回值为连续的空格与换行后的第一个有效字符在字符串的位置*/ int DeleteNull(string str,int i) for(;i+) if(stri!= stri!n) return i; bool IsBoundary(string str,int i) int t; char arr7=,(); for (t=0;t7;t+) if(stri=arrt) return true; return false; bool IsOperation(string str,int i) char arr8=+-*/8; /*此函数将一个个字符串数组输出到一个文件中*/ v)请输入目标文件名(包括路径与后缀名):file_name; ofstream outfile(file_name、c_str(),ios:out);outfile)file_name、c_str() int i; for(i=0;iv、size();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1