版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 编译原理课程设计 Course Design of Compiling (课程代码3273526) 半期题目: 词法和语法分析器 实验学期: 大三第二学期 学生班级: 2014级软件四班 学生学号: 2014112218 学生姓名: 何华均 任课教师 :丁光耀 信息科学与技术学院 2017. 6 课程设计1-C语言词法分析器 i. 题目 C语言词法分析 2. 内容 选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集, 不用 处理c语言的所有单词符号。 将解析到的单词符号对应的二元组输出到文件中保存 可以将扫描缓冲区与输入缓冲区合成一个缓冲区, 一次性输入源程序后就可以进 行预处理
2、了 3. 设计目的 掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原 理的理解 4. 设计环境(电脑语言环境) 语言环境:C语言 CPU:i7HQ6700 内存:8G 5. 概要设计(单词符号表,状态转换图) 5.1词法分析器的结构 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token 或sum)构成的序列。 词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序, 当需要一个单词时,就调用此法分析子程序返回一个单词. 存放最新读进的源程序字符 存放构成单词符号的字符串 字符缓冲区 存放保留字的符号和种别 为便于程序实现,假设每
3、个单词间都有界符或运算符或空格隔开,并引入下面 的全局变量及子程序: 1)ch 2)strToke n 3)Buffer 4)struct keyType 源程序 *输入缓冲区 调用 数据 、while - 返回一个单词 词法分析子程序 5.2待分析的简单词法预处理子程序 (1)保留字 break、case、char、const、int、 单词符号 种别码 单词符号 种别码 ID 0 sizeof 24 INT 1 static 25 auto 2 struct 26 break 3 switch 27 、(扫描缓冲区# 2 +、 (2)运算符1 、扫描缓冲区%1, 5.3各种单词符号对应的种
4、别码 case 4 typedef 28 char 5 union 29 const 6 un sig ned 30 con ti nue 7 void 31 default 8 volatile 32 do 9 while 33 double 10 = 34 else 11 + 35 enum 12 - 36 exter n 13 * 37 float 14 / 38 for 15 % 39 goto 16 5 40 if 17 41 int 18 ( 42 long 19 ) 43 register 20 ? 44 return 21 clear 45 short 22 # 46 sig
5、ned 23 lettet (letter|digit) * 47 dight dight* 48 5.3状态转换图 6. 详细设计(数据结构,子程序) 算法思想: 首先设置3个变量:strToken用来存放构成单词符号的字符串;ch 用来字符;struct keyType用来存放单词符号的种别码。扫描子程序主 要部分流程如下图所示。 子程序结构: 子程序名 功能 GETCHAR() 读一个字符到ch中 GETBC() 读一个非空白字符到ch中 CONCAT() 把CHAR中字符连接到strToken 之后 LETTER() 判断CHAR中字符是否为字母 DIGIT() 判断ch中字符是否为数
6、字 RESERVE。 用strToken中的字符串查找保留字表,并返回 保留字种别码,若返回零,则非保留字 RETRACT() 把CHAR中字符回送到缓冲区 7. 程序清单 / Con soleApplicatio nl.cpp :定义控制台应用程序的入口点 / #i nclude stdafx.h #i nclude stdio.h #i nclude stdlib.h #i nclude coni o.h #i nclude stri ng.h #defi ne N 47 char ch; char strToken20;/存放构成单词符号的字符串 char buffer1024;/ 字符
7、缓冲区 struct keyType char keyn ame256; int value; Key N = $ID ,0 , $INT ,1 , auto ,2 , break ,3 , case ,4 , char ,5 ,const ,6 , double ,10 , else ,11 , for ,15 ,goto ,16 ,if continue ,7 ,default ,8 ,do ,9 , enum,12 ,extern ,13 ,float ,14 , ,17 ,int ,18 ,long ,19 , register ,20 , return ,21 ,short ,22
8、, struct,26 ,switch ,27 , void ,31 , volatile ,32 , / ,38 ,%,39 , ,40 , I! I! signed ,23 , sizeof ,24 , static ,25 , typedef ,28 ,union ,29 ,unsigned ,30 , while ,33 ,= ,34 ,+ ,35 ,- ,36 , * ,37 , ;,41 ,( ,42 ,) ,43 ,? ,44 , clear, 45 ,# ,46 ; void GetChar() /读一个字符到ch中 int i; if (strlen(buffer)0) ch
9、 = buffer0; for (i = 0; i256; i+) bufferi = bufferi + 1; else ch = 0 void GetBC() /读一个非空白字符到ch中 int i; while (strlen(buffer) i = 0; ch = bufferi; for (; i= A else return false ; int Reserve() 0,则非保留字 /用strToken中的字符查找保留字表,并返回保留字种别码,若返回 int i; for (i = 0; i0; i-) bufferi = bufferi - 1; buffer0 = ch; c
10、h = 0 ; keyType ReturnWord() strcpy(strToken, 0 ); int c; keyType tempkey; GetBC(); if (ch =A 四、设计环境 语言环境:C语言 CPU:i7HQ6700 内存:8G 五、概要设计 5.1设计思路 语法分析的任务:把单词符号作为基本单位,分析程序是否为合法的程序 ,若能正 输出语 算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约 确地归约为文法的初始符号,则表示输入字串是合法的主要研究对输入的赋值语句、 句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提
11、 示错误相关信息。 文法表示: 4 v=E|E?|clear i E+T|E-T|T j T*F|T/F|F i (E)|v|c 5.2单词种别码设计 符号 种别码 = 1 ? 2 + 3 - 4 * 5 / 6 ( 7 ) 8 v 9 c 10 clear 11 # 12 N 13 六、详细设计 6.1变量及函数说明 变量及函数名 表示内容及操作 int priorityNUMNUM 优先关系矩阵 struct WordType 单词种别码结构 struct VarWord 变量表中的兀素结构 main Stack 归约栈 wordStack 单词串 GetwordStack() 输入串转化
12、成单词串 GetWord() 从单词串中取单词 ClearwordStack() 、ClearmainStack() 清空单词串和归约栈 CheckvarTable(char a) 查看变量在变量表中的位置 AddvarTable(VarWord a) 变量表添加变量 In itmai nStack() 初始化归约栈 Addmai nStack(WordType a) 归约栈添加 Han dle() 归约处理程序 Mai nHan dle() 归约子程序 七、程序清单 / / Con soleApplicati on l.cpp : 定义控制台应用程序的入口点 #include stdafx.
13、h #include stdio.h #include stdlib.h #include conio.h #include string.h #define NUM14 #define M256 #define N 47 / 保留字个数 char ch = 0 ; / 存放最新读进的源程序字符 char strToken20 = 0 ; / 存放构成单词符号的字符串 char buffer257 = 0 ; / 字符缓冲区 struct keyType char keyname256; int value; Key N = $ID ,0 , $INT ,1 , auto ,2 , break
14、 ,3 , case ,4 , char ,5 , const ,6 , double ,10 , else ,11 , for ,15 , goto ,16 , if continue ,7 , default ,8 , do ,9 , enum,12 , extern ,13 , float ,14 , ,17 , int ,18 , long ,19 , register ,20 , return ,21 , short ,22 , struct ,26 , switch ,27 , void ,31 , volatile ,32 , / ,38 , %,39 , , ,40 , # ,
15、46 ; I! I! signed ,23 , sizeof ,24 , static ,25 , typedef ,28 , union ,29 , unsigned ,30 , while ,33 , = ,34 , + ,35 , - ,36 , * ,37 , ; ,41 , ( ,42 , ) ,43 , ? ,44 , clear , 45 , / 优先关系矩阵 int priority NUM NUM= 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,1,0 ,
16、 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 , 0,0,0,-1,-1,-1,-1,-1,2,-1,0,0,0,0 , 0,0,0,1,1,1,1,0,1,0,0,0,1,0 , 0,0,1,1,1,1,1,0,1,0,0,0,1,0 , 0,0,0,0,0,0,0,0,0,0,0,0,1,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,-1,-1
17、,-1,-1,-1,0,0,0,0,3,0 , 0,0,1,0,0,0,0,0,0,0,0,0,1,0 ; struct VarTable VarWord elem M; int len; varTable; struct OperateStack WordTypeelem M; / 单词元素 int len; ; OperateStack mainStack; / 归约栈 OperateStack wordStack; struct WordType char word M; int value; wordType NUM= error ,0 , = ,1 , ? ,2 , + ,3 ,-
18、,4 ,* ,5 , / ,6 , ( ,7 , ) ,8 ,$i ,9 , $c ,10 , clear ,11 , # ,12 , $N ,13 ; /* 变量表 */ struct VarWord char varname M; / 变量名 char value M; bool flag; ; void GetChar() / 读一个字符到 ch 中 int i; if (strlen(buffer)0) ch = buffer0; for (i = 0; i256; i+) bufferi = bufferi + 1; else ch = 0 ; void GetBC() / 读一个非
19、空白字符到 ch 中 int i; while (strlen(buffer) i = 0; ch = bufferi; for (; i=A else return 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();
20、 if (ch =A 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() $c,10 ) int i; wordStack.len = 0; keyType temp; while (strlen(bu
21、ffer) temp = ReturnWord(); / 词法分析器获得一个分析词 if (temp.value = 1) / 常数 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
22、for (i = 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 ; /* 从单词串中取单词 */ WordTypeGetWord() WordTypet
23、emp = wordStack.elem0; for ( int i = 0; iwordStack.len - 1; i+) 查看变量在变量表中的位置 wordStack.elemi wordStack.len-; return temp; void ClearwordStack() wordStack.len = 0; void ClearmainStack() mainStack.len = 0; /* = wordStack.elemi + 1; / 清空单词串 / 清空归约栈 */ int CheckvarTable( char a) for ( int i = 0; i M; i+
24、) if (strcmp( a, varTable.elemi.varname) = 0) 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) ma
25、inStack.elemmainStack.len = a; mainStack.len+; /* 归约 */ bool Handle() 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(mai
26、nStack.elemmainStack.len - 1.word); if (i0) printf( n 变量 %s 未定义! , mainStack.elemmainStack.len - 1.word); return false ; else strcpy(mainStack.elemmainStack.len - 1.word, varTable.elemi.value); / 赋值归约 else if (mainStack.elemmainStack.len - 2.value = 1) if (mainStack.elemmainStack.len - 3.value = 9)
27、i = CheckvarTable(mainStack.elemmainStack.len - 3.word); if (i0) VarWord temp; strcpy(temp.varname, mainStack.elemmainStack.len - 3.word); strcpy(temp.value, mainStack.elemmainStack.len - 1.word); temp.flag = true ; AddvarTable(temp); else strcpy(varTable.elemi.value, mainStack.elemmainStack.len - 1
28、.word); strcpy(mainStack.elemmainStack.len - 3.word, mainStack.elemmainStack.len - 1.word); mainStack.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.l
29、en - 2; / 运算归约 else if (mainStack.elemmainStack.len - 2.value = 3) int a, b; a = atoi(mainStack.elemmainStack.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.len - 3.word); a = a*b; itoa(a, mainStack.elemmainStack.len - 3.word, 10); mainStack.len = mainStack.len - 2; / 输出语句 else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年特高压行业分析报告及未来发展趋势报告
- 2026年翻译服务行业分析报告及未来发展趋势报告
- 2026年顾桥矿运输考试题及答案
- 2025年胎儿宫内排尿监测试卷与答案
- 2026年公务员行测言语理解核心考点题库(附解析)
- 2026年防水漆行业分析报告及未来发展趋势报告
- 住院医师模拟试题(2025年)附答案
- 金秀瑶族自治县(2025年)公职人员考试时事政治考试试题(附含答案)
- 2025年新版停车教学考试题及答案
- 2026年产房工作制度试题及答案
- 2026合肥市产业投资控股(集团)有限公司(第二批)校园招聘19人笔试参考题库及答案解析
- 2026上海市闵行区区管国企招聘42人备考题库含答案详解(综合卷)
- 城市轨道交通站点周边地区设施空间规划设计导则(征求意见稿)
- 2026年高考作文素材积累之《人民日报》14篇时评赏析
- 东风奕派科技2026届春季全球校园招聘备考题库及答案详解(历年真题)
- 生成式AI在初中英语口语教学中的应用与效果评估研究教学研究课题报告
- 2026河南豫能控股股份有限公司及所管企业招聘31人备考题库及参考答案详解(能力提升)
- 国际海事避碰规则中英文解读
- 疫苗研发中的免疫耐受突破策略
- 司法实践中的价格鉴证应用
- 2025重庆机场集团有限公司校园招聘36人考试核心试题及答案解析
评论
0/150
提交评论