logo资料库

C语言(子集)词法分析器的设计.docx

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
1.设计内容
2.设计目的
3.处理子集及其种别码说明
4.状态转换图
5.实现思路概述
6.相关函数功能说明
7.测试实例
8.源程序
编译原理课程设计 1 题目: C 语言(子集)词法分析器的设计 学院: 西南交通大学 教师: 丁光耀 姓名: xxxx 学号: xxxxxxxxxxxx 班级: xxxxxxxxxxxxxxxxx
目录 1. 设计内容 ............................................................................................................................... 2 2. 设计目的 ............................................................................................................................... 2 3. 处理子集及其种别码说明...................................................................................................2 4. 状态转换图........................................................................................................................... 3 5. 实现思路概述 ....................................................................................................................... 4 6. 相关函数功能说明 ...............................................................................................................5 7. 测试实例 ............................................................................................................................... 5 8. 源程序................................................................................................................................... 6 1
1.设计内容 处理 c 语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单 词,以二元组形式存放在文件中。 2.设计目的 通过本课程设计,了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则, 掌握状态图到识别程序的编程。 3.处理子集及其种别码说明 符号 = + - * / ; ( ) { } , > < “ % & 种别码 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 符号 main int float double char long printf scanf for while switch case return break continue else system pause bool 标识符 数字 种别码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 36 37 2
4.状态转换图 3
5.实现思路概述 首先从文件中读取源程序,然后先进行预处理过滤掉那些无用符号和注释,然后将过滤 后的字符添加到一个 String 类型的字符串中去,再调用相关的处理函数来识别词形,并将该 词形及其对应的种别码以二元组的形式存储到文件中去,具体实现思路如下流程图: 4
6.相关函数功能说明 void GetChar() bool GetBC() bool IsLetter() bool IsDigit() int Reserve() void InsertId(int d) void PreProcessing() //对源程序进行预处理过滤掉空格和注释 void WordAnalysis() //词法分析函数 //从预处理后的串中获取字符 //检测空格 //判断是否为字母 //判断是否为数字 //在预留字表中查找,查找成功返回其种别码,否则返回 0 //将得到的 strToken 以二元组的形式加入到文件中去,d 为其种别码 7.测试实例 待处理源程序为: 处理结果: 5
8.源程序 #include #include using namespace std; char ch;//字符变量,存放最新读进的源程序字符 string tempstr;//暂存预处理后的源程序 string strToken;//用来存放过程单词符号的字符串 int pos = 0;//记录处理的位置 void GetChar()//从预处理后的串中获取字符 { ch = tempstr[pos]; pos++; } bool GetBC()//检测空格 { return ch == ' '; } bool IsLetter()//判断是否为字母 { return ('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z'); } bool IsDigit()//判断是否为数字 { return ('0' <= ch) && (ch <= '9'); } int Reserve()//在预留字表中查找,查找成功返回其种别码,否则返回0 { int flag = 0; FILE* fp; if ((fp = fopen("C:\\DataStructure\\ReservedWordList.txt", "r")) == NULL) { cout << "can not open the file\n" << endl; exit(0); } char s[20]; int data; while (!feof(fp))//遍历预留字文件 { 6
fscanf(fp, "%s %d\n", s,&data); string str(s); if (str == strToken)//该单词符号在预留字表中 { flag = data; break; } } fclose(fp); return flag; } void InsertId(int d)//将得到的strToken以二元组的形式加入到文件中去,d为其编码 { FILE* fp; if ((fp = fopen("C:\\DataStructure\\tuple.txt", "a")) == NULL) { cout << "can not open the file\n" << endl; exit(0); } fprintf(fp,"<%s , %d>\n",strToken.c_str(),d); fclose(fp); } void Retract()//回调一个位置 { pos--; } void PreProcessing()//预处理 { FILE* fp; char c; string str; if ((fp = fopen("C:\\DataStructure\\cpp.txt", "r")) == NULL) { cout << "can not open the file\n" << endl; exit(0); } while ((c = fgetc(fp)) != EOF)//获取源文件的代码 { str += c; 7
分享到:
收藏