




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程实验报告课程名称:编译原理专业班级: 信息安全1302班 学 号:姓 名:指导老师:报告日期: 2015年11月11日 计算机科学与技术学院目录实验一词法分析11. 实验目的12. 实验要求13. 算法思想24. 具体实现45. 结果分析56. 实验总结6实验二语法分析71. 实验目的72. 实验要求73. 算法思想84. 具体实现105. 结果分析126. 实验总结12附录源程序13词法分析13语法分析18实验一词法分析1. 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。2. 实验要求2.1 待分析的简单的词法(1)关键字:begin、if、then、while、d
2、o、end所有的关键字都是小写。(2)运算符和界符: = + - * / = = = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。2.2 各单词符号的种别码各种单词符号所对应的种别码如表1所示。2.3 词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放
3、的单词自身字符串; sum为整型常数。例如,对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)表1 各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17If2:=18Then320wile421do523letter(letter|digit)*10=24dight dight*11=25+13;2614(27*15)28/16#03. 算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想
4、是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.1 主程序框图主程序框图如图1-3-1所示。其中初始包括以下两个方面:(1)关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;(2)程序中需要用到的主要变量为syn,token和sum。3.2 扫描子程序的算法思想首先设置3个变量:token用来存
5、放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-3-2所示。置初值调用扫描子程序输出单词二元组输入串结束否是结束图1-3-1词法分析主程序框图变量初始化忽略空格返回是否文件结束? 是否字母拼字符串数字其他符号错误是否关键字?拼数对不同符号给出相应的syn值否报错syn=10是syn=11syn为对应关键字的单词种别码返回图1-3-2词法分析程序扫描子程序框图4. 具体实现char *rwtab6 = begin, if, then, while, do, end; /关键字表/*自选函数*/char m_getch() /从输入源读一个
6、字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = | ch= 10)ch = progp+;void concat() /拼接单词tokenm+ = ch;tokenm = 0;int letter() /判断是否是字母if(ch=a&ch=A&ch= 0 & ch = 9) return 1;else return 0;int reserve() /检索关键字表格int i;for(i=0; i9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(1,begin)(10,x)(18,:=)(11,9
7、)(26,;)(2,if)如图1-5-1所示:图1-5-1词法分析实验结果6. 实验总结词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。实验二语法分析1. 实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。2. 实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单语言的语法用扩充的BNF表示如下:(1):=beginend(2):=;(3):=(4):=ID:=(5):=+ |
8、-(6):=* | /(7):=ID | NUM | ()2.2 实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如:输入 begin a:=9; x:=2*3; b:=a+x end #输出 success!输入 x:=a+b*c end #输出 error3. 算法思想(1)主程序示意图如图2-3-1所示。置初值调用scaner读下一个单词符号调用lrparser结束图2-3-1 语法分析主程序框图(2)递归下降分析程序示意图如图2-3-2所示。(3)语句串分析过程示意图如图2-3-3所示。是否begin?调用s
9、tatement函数否是调用scaner是否 ;?否调用语句串分析程序是是否end?调用scaner否调用statement函数是调用scanersyn=0&kk=0?出错处理否出错处理是图2-3-3语句串分析示意图打印分析成功图2-3-2 递归下降分析程序示意图(4)statement语句分析程序流程如图2-3-4、2-3-5、2-3-6、2-3-7所示。是否标识符?调用term函数否调用scaner是否+ , -?否是否:=?是调用scaner否调用scaner调用term函数调用expression函数出错处理出错处理图2-3-4 statement函数示意图图2-3-5 express
10、ion函数示意图调用scaner调用factor函数是否标识符?是是否* , /?否是否整常数?否是是是否(?否否调用factor函数是出错处理调用scaner调用expression函数图2-3-6 term函数示意图是否)?否出错处理调用scaner调用scaner是图2-3-7 factor函数示意图4. 具体实现void factor()if(syn=10 | syn=11) scaner();else if(syn = 27) scaner(); /读下一个单词符号 expression(); /调用函数statement() if(syn = 28) scaner(); /读下一个
11、单词符号elseprintf(The error is on ).n);kk = 1; elseprintf(The expression is error!n);kk = 1; return;void term() factor(); /调用函数factor()while(syn=15 | syn=16) scaner(); /读下一个单词符号 factor(); /调用函数factor() return;void expression() term(); /调用函数term()while(syn=13 | syn=14) scaner(); /读下一个单词符号 term(); /调用函数t
12、erm() return;void statement()if(syn=10) scaner(); /读下一个单词符号if(syn=18) scaner(); /读下一个单词符号 expression(); /调用函数statement() elseprintf(the symbol := is error!n);kk=1; elseprintf(The sentence is error!n);kk=1; return;void yucu() statement(); /调用函数statement()while(syn = 26) scaner(); /读下一个单词符号if(syn != 6
13、) statement(); /调用函数statement() return;void lrparser()if(syn = 1) scaner(); /读下一个单词符号 yucu(); /调用yucu()函数if(syn = 6)scaner();if(syn=0 & kk=0)printf(Success!n); elseif(kk != 1)printf(The string is lack of a end!n);kk = 1; elseprintf(The string is lack of a begin!n);kk = 1; return;int main() p = 0;pri
14、ntf(Please input string (end of #): n);doscanf(%c, &ch);progp+ = ch;while(ch != #); p = kk = 0;scaner();lrparser();return 0;5. 结果分析(1)输入 begin a:=9; x:=2*3; b:=a+x end # 后,输出success!如图2-5-1所示:图2-5-1语法分析实验结果(一)(2)输入 x:=a+b*c end # 后,输出The string is lack of a begin!如图2-5-2所示:图2-5-2语法分析实验结果(二)6. 实验总结通过
15、本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则“调用scaner函数”“判断syn=0&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。附录源程序词法分析#include#include#include#include#includechar prog80, token80;char ch;int syn, p, m, n;char
16、*rwtab6 = begin, if, then, while, do, end;char m_getch() /从输入源读一个字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = | ch= 10)ch = progp+;void concat() /拼接单词tokenm+ = ch;tokenm = 0;int letter() /判断是否是字母if(ch=a&ch=A&ch= 0 & ch = 9) return 1;else return 0;int reserve() /检索关键字表格int i;for(i=0; i
17、6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retract() /回退一个字符p = p - 1;char *dtb()return NULL;void scaner() m = 0;for(n=0; n8; n+) tokenn = 0; m_getch();getbc();if(letter() while(letter() | digit() concat(); m_getch(); retract();syn = reserve(); else if(digit() while(digit() concat(); m
18、_getch(); retract();syn = 11; elseswitch(ch) case ) syn = 21;concat(); else if(ch = =) syn = 22;concat(); else syn = 20;retract(); break;case :concat(); m_getch();if(ch = =) syn = 24;concat(); else syn = 23;retract(); break;case :concat(); m_getch();if(ch = =) syn = 18;concat(); else syn = 17;retrac
19、t(); break;case +:syn = 13;token0 = ch;break;case -:syn = 14;token0 = ch;break;case *:syn = 15;token0 = ch;break;case /:syn = 16;token0 = ch;break;case =:syn = 25;token0 = ch;break;case ;:syn = 26;token0 = ch;break;case (:syn = 27;token0 = ch;break;case ):syn = 28;token0 = ch;break;case #:syn = 0;to
20、ken0 = ch;break; int main() p = 0;printf(Please input string (end of #): n);do scanf(%c, &ch);progp+ = ch;while(ch != #); p = 0;do scaner();switch(syn) case -1:printf(you have inputed a wrong string!n);getch();exit(0);default:printf(%d, %s)n, syn, token);break; while(syn != 0);return 0;语法分析#include#
21、include#include#include#includevoid expression();char prog80, token80;char ch;int syn, p, m, n, kk;char *rwtab6 = begin, if, then, while, do, end;char m_getch() /从输入源读一个字符到CH中ch = progp+;return ch;void getbc() /去掉空白字符while (ch = | ch= 10)ch = progp+;void concat() /拼接单词tokenm+ = ch;tokenm = 0;int let
22、ter() /判断是否是字母if(ch=a&ch=A&ch= 0 & ch = 9) return 1;else return 0;int reserve() /检索关键字表格int i;for(i=0; i6; i+)if(!strcmp(rwtabi, token)return i+1;return 10;void retract() /回退一个字符p = p - 1;char *dtb()return NULL;void scaner() m = 0;for(n=0; n8; n+) tokenn = 0; m_getch();getbc();if(letter() while(lett
23、er() | digit() concat(); m_getch(); retract();syn = reserve(); else if(digit() while(digit() concat(); m_getch(); retract();syn = 11; elseswitch(ch) case ) syn = 21;concat(); else if(ch = =) syn = 22;concat(); else syn = 20;retract(); break;case :concat(); m_getch();if(ch = =) syn = 24;concat(); els
24、e syn = 23;retract(); break;case :concat(); m_getch();if(ch = =) syn = 18;concat(); else syn = 17;retract(); break;case +:syn = 13;token0 = ch;break;case -:syn = 14;token0 = ch;break;case *:syn = 15;token0 = ch;break;case /:syn = 16;token0 = ch;break;case =:syn = 25;token0 = ch;break;case ;:syn = 26
25、;token0 = ch;break;case (:syn = 27;token0 = ch;break;case ):syn = 28;token0 = ch;break;case #:syn = 0;token0 = ch;break; void factor()if(syn=10 | syn=11) scaner();else if(syn = 27) scaner(); /读下一个单词符号 expression(); /调用函数statement() if(syn = 28) scaner(); /读下一个单词符号else printf(The error is on ).n);kk = 1; else printf(The expression is error!n);kk = 1; return;void term() factor(); /调用函数factor()while(syn=15 | syn=16) scaner(); /读下一个单词符号 facto
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 21711.3-2025基础机电继电器第3部分:强制定位(机械联锁)触点继电器
- 2025年初升高暑期数学讲义专题09 函数及其表示分层训练(含答案)
- 2003年江苏省淮安市中考数学真题【含答案、解析】【含答案、解析】
- 生物●广东卷丨2023年广东省普通高中学业水平选择性考试生物试卷及答案
- 布洛芬片的紫外鉴别授课冯白茹药物分析92课件
- 薄层色谱法35课件
- 考研复习-风景园林基础考研试题附参考答案详解(夺分金卷)
- 风景园林基础考研资料试题及参考答案详解(达标题)
- (高清版)DB62∕T 1247-2019 蕨麻猪
- 2024年山东华兴机械集团有限责任公司人员招聘笔试备考题库附答案详解(预热题)
- 新能源汽车与传统汽车的对比
- 头孢呋辛酯的代谢产物与毒理学研究
- 《坚持才会有收获》-小学道德与法治坚持才会有收获课件2
- 《柴油机常见故障》课件
- 中国非特异性腰背痛临床诊疗指南
- 基于STM32的智能避障循迹小车系统设计答辩模板
- 机械连接预应力混凝土异型桩L19ZG403
- C++17入门经典(第5版)
- 普外科肿瘤外科乳腺癌一病一品优质护理汇报
- 驾校消防安全知识培训
- 23秋国家开放大学《农业经济基础》形考任务1-4参考答案
评论
0/150
提交评论