编译原理课程设计报告-词法语法分析器(共22页).doc

上传人:飞****2 文档编号:15113111 上传时间:2022-05-11 格式:DOC 页数:22 大小:383.50KB
返回 下载 相关 举报
编译原理课程设计报告-词法语法分析器(共22页).doc_第1页
第1页 / 共22页
编译原理课程设计报告-词法语法分析器(共22页).doc_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《编译原理课程设计报告-词法语法分析器(共22页).doc》由会员分享,可在线阅读,更多相关《编译原理课程设计报告-词法语法分析器(共22页).doc(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上编译原理课程设计Course Design of Compiling (课程代码)半期题目: 词法和语法分析器实验学期: 大三第二学期学生班级: 2014级软件四班学生学号: 学生姓名: 何华均任课教师:丁光耀信息科学与技术学院2017.6课程设计1-C语言词法分析器1.题目C语言词法分析2.内容选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。将解析到的单词符号对应的二元组输出到文件中保存可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了3.设计目的掌握词法分析算法,设计、编制并调试一个词法分

2、析程序,加深对词法分析原理的理解4.设计环境(电脑语言环境)语言环境:C语言CPU:i7HQ6700内存:8G5.概要设计(单词符号表,状态转换图)5.1 词法分析器的结构词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符2) strToken 存放构成单词符号的字符串3) Buffer字符缓冲区4)

3、struct keyType 存放保留字的符号和种别源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序返回一个单词调用数据5.2 待分析的简单词法(1)保留字break、case、char、const、int、do、while(2)运算符和界符= 、+、 -、 * 、/、%、,、;、(、)、?、#5.3 各种单词符号对应的种别码单词符号种别码 单词符号种别码ID0sizeof24INT1static25auto2struct26break3switch27case4typedef28char5union29const6unsigned30continue7void31defau

4、lt8volatile32do9while33double10=34else11+35enum12-36extern 13*37float14/38for15%39goto16,40if17;41int18(42long19)43register20?44return21clear45short22#46signed23lettet(letter|digit)*47dight dight*485.3 状态转换图6.详细设计(数据结构,子程序) 算法思想: 首先设置3个变量:strToken用来存放构成单词符号的字符串;ch用来字符;struct keyType用来存放单词符号的种别码。扫描子程

5、序主要部分流程如下图所示。子程序结构:子程序名功能GETCHAR()读一个字符到 ch 中GETBC()读一个非空白字符到ch 中CONCAT()把CHAR 中字符连接到strToken 之后LETTER()判断CHAR 中字符是否为字母DIGIT()判断ch 中字符是否为数字RESERVE()用strToken中的字符串查找保留字表,并返回保留字种别码,若返 回零,则非保留字RETRACT()把CHAR 中字符回送到缓冲区7.程序清单/ ConsoleApplication1.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include stdio.h#inc

6、lude stdlib.h#include conio.h#include string.h#define N 47char ch;char strToken20;/存放构成单词符号的字符串char buffer1024;/字符缓冲区struct keyType char keyname256;int value;KeyN = $ID,0 , $INT,1 , auto,2 , break,3 , case,4 , char,5 , const,6 , continue,7 , default,8 , do,9 , double,10 , else,11 , enum,12 , extern,

7、13 , float,14 , for,15 , goto,16 , if,17 , int,18 , long,19 , register,20 , return,21 , short,22 , signed,23 , sizeof,24 , static,25 , struct,26 , switch,27 , typedef,28 , union,29 , unsigned,30 , void,31 , volatile,32 , while,33 , =,34 , +,35 , -,36 , *,37 , /,38 , %,39 , ,40 , ;,41 , (,42 , ),43 ,

8、 ?,44 , clear,45 , #,46 ;void GetChar()/读一个字符到ch中int i;if (strlen(buffer)0) ch = buffer0;for (i = 0; i256; i+)bufferi = bufferi + 1;elsech = 0;void GetBC()/读一个非空白字符到ch中int i;while (strlen(buffer) i = 0;ch = bufferi;for (; i= A&ch = a&ch = 0&ch = 9)return true;elsereturn false;int Reserve()/用strToken

9、中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字int i;for (i = 0; i0; i-)bufferi = bufferi - 1;buffer0 = ch;ch = 0;keyType ReturnWord()strcpy(strToken, 0);int c;keyType tempkey;GetBC();if (ch = A&ch = a&ch = 0&ch 0) ch = buffer0;for (i = 0; i256; i+)bufferi = bufferi + 1;elsech = 0;void GetBC()/读一个非空白字符到ch中int i;whi

10、le (strlen(buffer) i = 0;ch = bufferi;for (; i= A&ch = a&ch = 0&ch = 9)return true;elsereturn false;int Reserve()/用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字int i;for (i = 0; i0; i-)bufferi = bufferi - 1;buffer0 = ch;ch = 0;keyType ReturnWord()strcpy(strToken, 0);int c;keyType tempkey;GetBC();if (ch =

11、A&ch = a&ch = 0&ch = 9) ConCat();GetChar();while (Digit() ConCat();GetChar();Retract();strcpy(tempkey.keyname, strToken);tempkey.value = 1;else ConCat();strcpy(tempkey.keyname, strToken);tempkey.value = Reserve();return tempkey;bool GetwordStack() int i;wordStack.len = 0;keyType temp;while (strlen(b

12、uffer) temp = ReturnWord();/词法分析器获得一个分析词if (temp.value = 1)/常数($c,10)strcpy(wordStack.elemwordStack.len.word, temp.keyname);wordStack.elemwordStack.len.value = 10;else if (temp.value = 0)/变量($i,9)strcpy(wordStack.elemwordStack.len.word, temp.keyname);wordStack.elemwordStack.len.value = 9;else for (i

13、 = 0; iNUM; i+) if (strcmp(temp.keyname, wordTypei.word) = 0)/关键字wordStack.elemwordStack.len = wordTypei;break;else if (i = NUM - 1) printf(输入串中出现未识别单词!n);return false;wordStack.len+;wordStack.elemwordStack.len+ = wordType12;return true;/*从单词串中取单词*/WordType GetWord() WordType temp = wordStack.elem0;

14、for (int i = 0; iwordStack.len - 1; i+)wordStack.elemi = wordStack.elemi + 1;wordStack.len-;return temp;void ClearwordStack()/清空单词串wordStack.len = 0;void ClearmainStack()/清空归约栈mainStack.len = 0;/*查看变量在变量表中的位置*/int CheckvarTable(char a) for (int i = 0; iM; i+)if (strcmp(a, varTable.elemi.varname) = 0

15、)return i;else if (i = M - 1)return -1;/*添加变量*/void AddvarTable(VarWord a) varTable.elemvarTable.len = a;varTable.len+;/*初始化归约栈*/void InitmainStack()mainStack.elem0 = wordType12;mainStack.len = 1;/*添加归约栈*/void AddmainStack(WordType a)mainStack.elemmainStack.len = a;mainStack.len+;/*归约*/bool Handle()

16、int i;/常量归约if (mainStack.elemmainStack.len - 1.value = 10) mainStack.elemmainStack.len - 1.value = 13;/变量归约else if (mainStack.elemmainStack.len - 1.value = 9) mainStack.elemmainStack.len - 1.value = 13;i = CheckvarTable(mainStack.elemmainStack.len - 1.word);if (i0) printf(n变量 %s 未定义!, mainStack.elem

17、mainStack.len - 1.word);return false;elsestrcpy(mainStack.elemmainStack.len - 1.word, varTable.elemi.value);/赋值归约else if (mainStack.elemmainStack.len - 2.value = 1) if (mainStack.elemmainStack.len - 3.value = 9) i = CheckvarTable(mainStack.elemmainStack.len - 3.word);if (i0) VarWord temp;strcpy(temp

18、.varname, mainStack.elemmainStack.len - 3.word);strcpy(temp.value, mainStack.elemmainStack.len - 1.word);temp.flag = true;AddvarTable(temp);elsestrcpy(varTable.elemi.value, mainStack.elemmainStack.len - 1.word);strcpy(mainStack.elemmainStack.len - 3.word, mainStack.elemmainStack.len - 1.word);mainSt

19、ack.elemmainStack.len - 3.value = 13;else if (mainStack.elemmainStack.len - 3.value = 13)strcpy(mainStack.elemmainStack.len - 3.word, mainStack.elemmainStack.len - 1.word);mainStack.len = mainStack.len - 2;/运算归约else if (mainStack.elemmainStack.len - 2.value = 3) int a, b;a = atoi(mainStack.elemmainS

20、tack.len - 1.word);b = atoi(mainStack.elemmainStack.len - 3.word);a = a + b;itoa(a, mainStack.elemmainStack.len - 3.word, 10);mainStack.len = mainStack.len - 2;else if (mainStack.elemmainStack.len - 2.value = 5) int a, b;a = atoi(mainStack.elemmainStack.len - 1.word);b = atoi(mainStack.elemmainStack

21、.len - 3.word);a = a*b;itoa(a, mainStack.elemmainStack.len - 3.word, 10);mainStack.len = mainStack.len - 2;/输出语句else if (wordStack.elem0.value = 2 & mainStack.elemmainStack.len - 1.value = 13 & mainStack.elemmainStack.len - 2.value = 12) printf(n表达式的值为 %s, mainStack.elemmainStack.len - 1.word);mainS

22、tack.len = 0;/结束归约else if (mainStack.elemmainStack.len - 2.value = 12 & wordStack.elem0.value = 12)mainStack.len = mainStack.len - 2;return true;bool MainHandle() while (wordStack.len)if (prioritymainStack.elemmainStack.len - 1.valuewordStack.elem0.value != 1)AddmainStack(GetWord();else if (mainStac

23、k.len) /printf(n);for (int i = 0; imainStack.len; i+)printf(%s,%d), mainStack.elemi.word, mainStack.elemi.value);Handle();break;if (mainStack.len)MainHandle();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; iwordStack.len; i+)printf(%s,%d), wordStack.elemi.word, wordStack.elemi.value);printf(n当前归约栈:);InitmainStack();MainHandle();printf(结束n);return 0;八、 运行结果

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com