系统软件开发实践实验报告(计科-4 徐竹)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

中国矿业大学计算机学院2012级本科生实验报告课程名称系统软件开发实践报告时间2015/5/1学生姓名徐竹学号08123325专业计算机科学与技术任课教师刘晋-任课教师评语任课教师评语(①对实验课程基础理论的掌握;②对实验课程知识应用能力的评价;③对课程报告相关实验、作品、软件等成果的评价;④实验课学习态度和上课纪律;⑤实验课程成果和报告工作量;⑥总体评价和成绩;⑦存在问题等):成绩:任课教师签字:年月日《系统软件开发实践》实验报告第1页-实验一(第一周)词法分析器(flex实验)一、实验目的1、通过对flex基本知识的阅读,了解其工作原理和过程以及其匹配模式和规则,掌握简单的lex语法和规则;2、在上述基础上能够自主编写出简单且可以运行的词法分析器,实现简单的词法分析功能;3、通过实验,设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验说明本次编制调试的词法分析器基本可以实现如下简单功能:1、可以匹配识别关键字:elseifswitchforintfloatreturnvoidwhile(所有的关键字都是保留字,并且必须是小写);2、可以匹配识别专用符号:+-*/====!==;,()[]{}/**/3、标识符(ID)和数字(NU)通过下列正则表达式定义:ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|94、可以匹配识别空格(空格由空白、换行符和制表符组成,空格通常被忽略,,除了它必须分开ID、NUM关键字);5、可以识别简单的注释(/*注释内容*/);三、实验原理与分析词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析是编译程序的第一个阶段且是必要阶段;词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程序的常用途径:自动生成,手工生成。而本次实验用的是自动生成工具flex,相对于手动生成可以极大地减少工作量。《系统软件开发实践》实验报告第2页-单词的描述也就是模式(LexicalPattern),模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件,输出一个如下所示的C语言源程序。|输入文件*.l|------|flex工具|------|输出文件lex.yy.c|FLEX的输入文件为LEX源文件,它内含正规表达式和对相应模式处理的C语言代码。FLEX通过对.l源文件的扫描自动生成相应的词法分析函数intyylex(),并将之输出到lex.yy.c的文件中。该文件即为LEX的输出文件或输出的词法分析器。LEX的源文件由三个部份组成,每个部分之间用顶行的“%%”分割,其格式如下:定义部份%%规则部份%%用户附加C语言部份其中,定义部分由C语言代码、模式的宏定义、条件模式的开始条件说明三部份组成。C代码部份由顶行的%{和}%引入,LEX扫描源文件时将%{和}%之间的部分原封不动的拷贝到输出文件lex.yy.c中。而模式宏定义则是一个正则表达式的定义。正则表达式的匹配如下:第二部分规则部份是LEX源文件的核心部份,它包括一组模式和在生成分析器识别相应模式后对相应模式进行处理的C语言动作(Action)。LEX对第三部分不作任何处理,仅仅将之直接拷贝到输出文件lex.yy.c的尾部。在些部份,可定义对模式进行处理的C语言函数、主函数和yylex要调用的函数yywrap()等。如果用户在其它C模块中提供这些函数,用户代码部份可以省略。yylex()函数被调用之后,它首先检查全局文件指针变量yyin是否有定义,如有,则将之设置为将要扫描的文件指针。如无,则设置为标准输入文件stdin。同理,如全局文件指针变量yyout无定义,则将之设置为标准输出文件stdout。若有多个模式与被扫描文《系统软件开发实践》实验报告第3页-件中的字符串相匹配,则yylex()执行能匹配最长字符串的模式,称为“最长匹配原则”;若还有多个模式匹配长度相同的字符串,则yylex()选择在LEX源文件中排列最前面的模式进行匹配,称为“最先匹配原则”。yylex()常通过超前搜索一个字符来实现这样的原则,如果使用超前搜索匹配了某一模式,则yylex()在进行下一次分析前,将回退一个字符。另外,LEX提供控制模式在一定状态下使用的功能,称为条件模式。LEX首先在定义部份通过%start来定义条件句。在规则部份可通过宏BEGIN条件名来激活条件。BEGININITIAL或BEGIN0将休眠所有的条件模式,使分析器回到开始状态。四、实验步骤和过程分析1、lex源代码编写通过前期对flex的了解自主编写了以下简单的的词法分析器,该词法分析器能够实现基本的词法分析功能如行数、关键字个数、单词个数以及简单注释等的判别。由于功能简单,所以本次代码完全是自己一一在记事本里面编写而成;digit[0-9]NUM[digit][digit]*/*此正则表达式用于对数字进行匹配*/letter[A-Za-z]ID[letter][letter]*/*此正则表达式是用于对标示符进行模式匹配*/else{num_id++;}while{++num_id;}/*这是实现代对关键字进行匹配*/+|-|*|/|=||=||=|==|!=|;|,|(|)|[|]|{|}|/*|\*{fuhao++;}/*这些代码可以用于匹配其它符号*/[^\t\n]+{nword++;}/*识别单词个数*/\n{hangshu++;}/*对行数进行识别并统计*//*下面再编写一个comment函数用于判断注释*/comment(){charc,c1;loop:while((c=input())!='*'&&(c!=0))putchar('\n');if((c1=input())!='/'&&c!=0){unput(c1);gotoloop;}if(c!=0)putchar('\n');}intyywrap(){return1;}最后将这些代码按照flex语法进行整合得到完整flex源码。《系统软件开发实践》实验报告第4页-2、通过命令行调试运行得到lex.yy.exe文件;3、编写测试文件(命名为123.cpp)并与lex.yy.exe放于同一文件夹内;123.cpp:#includeiostreamusingnamespacestd;intmain{inta=33,b=1123;c=12;c=a+b;coutfelx123endl;return0;}4、运用命令行的lex.yy.exe123.cpp运行得到结果:五、实验小结本次实验通过对flex基本知识的阅读基本掌握了简单的lex语法和规则,也可以自行设计编制调试一个具体的词法分析程序,不仅加深对了词法分析原理的理解,也初步掌握了在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。实验二(第二周)语法分析器(bison简单实验)一、实验目的1、了解语法分析工具bison的用法和自动生成语法分析器的过程和原理;《系统软件开发实践》实验报告第5页-2、学习和掌握flex与bison联合编译的思想和方法,能够通过这种方法编译实现基本编译器的构造和设计。二、实验说明bison是属于GNU项目的一个语法分析器生成器。Bison把一个关于“向前查看从左到右最右”(LALR)上下文无关文法的描述转化成可以分析该文法的C或C++程序。它也可以为二义文法生成“通用的从左到右最右”(GLR)语法分析器。本次试验主要是学习并利用语法分析器生成工具Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子,实验中可以编写一个测试程序,以给定的测试文件作为输入,输出运行结果到输出文件中。三、实验原理与分析Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。使用bison的前提是使用flex事先生成相关词法分析器。Flex可以识别正则表达式,而bison可以识别语法。Flex把输入流分解为若干个片段(记号),而bison则可以将这些记号基于逻辑进行合并。Bison基于我们所给定的语法来生成一个可以识别这个语法中有效语句的语法分析器。而且bison只处理语法,你需要保证其他部分的完整性。语法由一系列规则组成,语法分析器就是基于这些规则来识别语法上正确的输入。Bison的.y文件也是分成三个部分:1、声明部分:所有词法单元的定义可以放在此处2、规则部分:具体的语法和相应的动作3、用户自定义部分。第三部分会被bison原封不动的拷贝进生成的.C文件当bison读入一个终结符(token),它会将该终结符及其语意值一起压入堆栈。这个堆栈叫做分析器堆栈(parserstack)。把一个token压入堆栈通常叫做移进(shifting)。但堆栈并不是每读入一个终结符就分配一个栈元素给它。当已经移进的后n个终结符和组(groupings)与一个文法规则相匹配时,它们会被根据那个规则结合起来。这叫做归约(reduction)。栈中的那些终结符和组会被单个的组(grouping)替换。那个组的符号就是那个规则的结果。执行该规则的相应的动作(Action)也是归约处理的一部分,这个动作会计算这个组的语意值。分析器通过移进和归约尝试着缩减整个输入到单个的组。这个组的符号就是文法中的起始符号(start-symbol)。Bison分析器并不总是在后n个终结符与组匹配某一规则时立《系统软件开发实践》实验报告第6页-即就进行归约。这种策略对于大部分语言来说并不合适。相反,当可以进行归约时,分析器有时会“预读”(looksahead)下一个终结符来决定做什么。当一个终结符被读进来后,并不会立即移进堆栈,而是首先作为一个预读终结符(look-aheadtoken)。此后,分析器开始对栈上的终结符和组执行一个或多个归约,而预读终结符仍然放在一边。当没有归约可做时,这个预读终结符才会被移进堆栈。这并不表示所有可能的归约都已经做了,这要取决于预读终结符的类型,一些规则可能选择推迟它们的使用。四、实验过程详细分析和步骤(1)简单bison与flex联合编译实验1、window下首先将bison安装在与flex安装的相同目录下,编写编写bison文件即.y文件并保存在bison目录下,然后通过调用命令行生成.tab.c和.tab.h文件;2、编写词法分析文件并将上述的.Tab.h包含在头文件中,然后后调用命令行生成.yy.c文件,利用命令行将.yy.c和.tab.c文件生成为可执行文件exe文件;3、在命令行里利用生成的exe文件调用测试文件得到结果。(2)利用语法分析器生成工具Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。1、编写代码并分别编译flex和bison产生相应文件;2、comment函数调用yyinput,编译的时候出现了链接错误,将lex.yy.c中的yyinput函数定义拷贝一份到input.lex,重命名为my_yyinput即可解决,另外还要修改生成《系统软件开发实践》实验报告第7页-的cgrammar-new.tab.c文件中的一段代码并删去“if(!yyin)yyin=stdin”才可以编译通过(解析之前,还要设置yyin为输入文件指针);3、在命令行里利用生成的exe文件调用测试文件得到结果。五、实验小结相对于flex源文件,bison源文件的编写更为艰难,但

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功