编译原理报告 9_第1页
编译原理报告 9_第2页
编译原理报告 9_第3页
编译原理报告 9_第4页
编译原理报告 9_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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、i

2、f、then、while、do、end所有的关键字都是小写。(2)运算符和界符: = + - * / = = = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)* NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。2.2 各单词符号的种别码各种单词符号所对应的种别码如表1所示。2.3 词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为

3、单词种别码; token为存放的单词自身字符串; 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。

5、3.2 扫描子程序的算法思想首先设置3个变量:token用来存放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-3-2所示。置初值调用扫描子程序输出单词二元组输入串结束 否 是结束 图1-3-1 词法分析主程序框图变量初始化忽略空格返回是否文件结束? 是 否 字母拼字符串数字其他符号 错误是否关键字?拼数 对不同符号给出相应的syn值否报错syn=10 是syn=11syn为对应关键字的单词种别码返回 图1-3-2 词法分析程序扫描子程序框图4. 具体实现char *rwtab6 = begin, if, then, while, do,

6、 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; i9 then x:=2*x+1/3; e

7、nd # 后经词法分析输出如下序列:(1, begin) (10, x) (18, :=) (11, 9) (26, ;) (2, if) 如图1-5-1所示:图1-5-1 词法分析实验结果6. 实验总结词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。实验二 语法分析1. 实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。2. 实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单

8、语言的语法用扩充的BNF表示如下:(1):=beginend(2):=;(3):=(4):=ID:=(5):=+ | -(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 语法分析

9、主程序框图(2)递归下降分析程序示意图如图2-3-2所示。(3)语句串分析过程示意图如图2-3-3所示。 是否begin?调用statement函数否是调用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 否调

10、用scaner调用term函数调用expression函数出错处理出错处理图2-3-4 statement函数示意图 图2-3-5 expression函数示意图调用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) s

11、caner(); /读下一个单词符号 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(); /读下一个单词符号 factor(); /调用函数factor() return;void expre

12、ssion() term(); /调用函数term() while(syn=13 | syn=14) scaner(); /读下一个单词符号 term(); /调用函数term() return;void statement() if(syn=10) scaner(); /读下一个单词符号 if(syn=18) scaner(); /读下一个单词符号 expression(); /调用函数statement() else printf(the symbol := is error!n); kk=1; else printf(The sentence is error!n); kk=1; ret

13、urn;void yucu() statement(); /调用函数statement() while(syn = 26) scaner(); /读下一个单词符号 if(syn != 6) statement(); /调用函数statement() return;void lrparser() if(syn = 1) scaner(); /读下一个单词符号 yucu(); /调用yucu()函数 if(syn = 6) scaner(); if(syn=0 & kk=0) printf(Success!n); else if(kk != 1) printf(The string is lack

14、 of a end!n); kk = 1; else printf(The string is lack of a begin!n); kk = 1; return;int main() p = 0; printf(Please input string (end of #): n); do scanf(%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-

15、1所示:图2-5-1 语法分析实验结果(一)(2)输入 x:=a+b*c end # 后,输出The string is lack of a begin!如图2-5-2所示:图2-5-2 语法分析实验结果(二)6. 实验总结通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则“调用scaner函数”“判断syn=0&kk=0是否成立”成立则说明分析成功打印

16、出来。不成立则“出错处理”。附录源程序词法分析#include#include#include#include#includechar prog80, token80;char ch;int syn, p, m, n;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 =

17、 0;int letter() /判断是否是字母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(lette

18、r() while(letter() | digit() concat(); m_getch(); retract(); syn = reserve(); else if(digit() while(digit() concat(); m_getch(); retract(); syn = 11; else switch(ch) case ) syn = 21; concat(); else if(ch = =) syn = 22; concat(); else syn = 20; retract(); break; case : concat(); m_getch(); if(ch = =)

19、 syn = 24; concat(); else 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; ca

20、se =: 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; token0 = ch; break; int main() p = 0; printf(Please input string (end of #): n); do scanf(%c, &ch); progp+ = ch; while(ch != #); p =

21、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#include#include#include#includevoid expression();char prog80, token80;char ch;int syn, p, m, n, kk;char *rwtab6 = beg

22、in, 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; i6; i+)if(!st

23、rcmp(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_getch()

24、; retract(); syn = 11; else switch(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;

25、 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; token0 = ch; break; case (: syn = 27; token0 = ch; break; case ): syn = 2

26、8; 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(); /读下一个单词符号 f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论