1、编译原理课程设计报告词法语法分析器编译原理课程设计Course Design of Compiling (课程代码3273526)半期题目: 词法和语法分析器实验学期: 大三第二学期学生班级: 2014级软件四班学生学号: 18学生姓名: 何华均任课教师:丁光耀信息科学与技术学院课程设计1-C语言词法分析器1.题目C语言词法分析2.内容选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。将解析到的单词符号对应的二元组输出到文件中保存可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了3.设计目的掌握词法分析算法,设计、编制并
2、调试一个词法分析程序,加深对词法分析原理的理解4.设计环境(电脑语言环境)语言环境:C语言CPU:i7HQ6700内存:8G5.概要设计(单词符号表,状态转换图) 词法分析器的结构词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符2) strToken 存放构成单词符号的字符串3) Buffer 字符
3、缓冲区4)struct keyType 存放保留字的符号和种别源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序返回一个单词调用数据 待分析的简单词法 (1)保留字 break、case、char、const、int、do、while(2)运算符和界符 = 、+、 -、 * 、/、%、,、;、(、)、# 各种单词符号对应的种别码单词符号种别码 单词符号种别码ID0sizeof24INT1static25auto2struct26break3switch27case4typedef28char5union29const6unsigned30continue7void31defau
4、lt8volatile32do9while33double10=34else11+35enum12-36extern 13*37float14/38for15%39goto16,40if17;41int18(42long19)43register2044return21clear45short22#46signed23lettet(letter|digit)*47dight dight*48 状态转换图6.详细设计(数据结构,子程序) 算法思想: 首先设置3个变量:strToken用来存放构成单词符号的字符串;ch用来字符;struct keyType用来存放单词符号的种别码。扫描子程序主要部
5、分流程如下图所示。子程序结构:子程序名功能GETCHAR()读一个字符到 ch 中GETBC()读一个非空白字符到ch 中CONCAT()把CHAR 中字符连接到strToken 之后LETTER()判断CHAR 中字符是否为字母DIGIT()判断ch 中字符是否为数字RESERVE()用strToken中的字符串查找保留字表,并返回保留字种别码,若返 回零,则非保留字RETRACT()把CHAR 中字符回送到缓冲区7.程序清单eyname) = 0) return Keyi.value; return 0;void Retract() alue; else if (ch = 0&ch = 0
6、&ch = 9) ConCat(); GetChar(); while (Digit() ConCat(); GetChar(); Retract(); strcpy, strToken); = 1; else ConCat(); strcpy, strToken); = Reserve(); return tempkey; bool GetwordStack() int i; = 0; keyType temp; while (strlen(buffer) temp = ReturnWord(); ord, ; .value = 10; else if = 0) ord, ; .value
7、= 9; else for (i = 0; iNUM; i+) if (strcmp, wordTypei.word) = 0) arname) = 0) return i; else if (i = M - 1) return -1;/*添加变量*/void AddvarTable(VarWord a) = a; +;/*初始化归约栈*/void InitmainStack() 0 = wordType12; = 1;/*添加归约栈*/void AddmainStack(WordType a) = a; +;/*归约*/bool Handle() int i; alue = 10) - 1.
8、value = 13; alue = 9) - 1.value = 13; i = CheckvarTable - 1.word); if (i0) printf(n变量 %s 未定义!, - 1.word); return false; else strcpy - 1.word, i.value); alue = 1) if - 3.value = 9) i = CheckvarTable - 3.word); if (i0) VarWord temp; strcpy, - 3.word); strcpy, - 1.word); = true; AddvarTable(temp); else
9、 strcpyi.value, - 1.word); strcpy - 3.word, - 1.word); - 3.value = 13; else if - 3.value = 13) strcpy - 3.word, - 1.word); = - 2; alue = 3) int a, b; a = atoi - 1.word); b = atoi - 3.word); a = a + b; itoa(a, - 3.word, 10); = - 2; else if - 2.value = 5) int a, b; a = atoi - 1.word); b = atoi - 3.wor
10、d); a = a*b; itoa(a, - 3.word, 10); = - 2; alue = 2 & - 1.value = 13 & - 2.value = 12) printf(n表达式的值为 %s, - 1.word); = 0; alue = 12 & 0.value = 12) = - 2; return true;bool MainHandle() while if (priority - 1.value0.value != 1) AddmainStack(GetWord(); else if ord, i.value); Handle(); break; if MainHa
11、ndle(); return true;/*主函数*/int main() int ok = 1; WordType temp; int ii = 0; while (ok) printf(n); printf(输入第 %d 语句串:,+ii); scanf(%s, buffer); printf(单词串:); if (!GetwordStack() return 0; for (int i = 0; i; i+) printf(%s,%d), i.word, i.value); printf(n当前归约栈:); InitmainStack(); MainHandle(); printf(结束n); return 0;八、 运行结果九、 实验体会通过本次语法分析设计实验,我加深了对语法分析过程的理解。并在实际的设计过程深入的了解了编译原理思想。对编译原理课程有了更深的理解
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1