ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:225.96KB ,
资源ID:11189444      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11189444.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息工程学院编译原理实习指导书.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息工程学院编译原理实习指导书.docx

1、信息工程学院编译原理实习指导书编译原理实验指导书西北农林科技大学信息工程学院2010年9月29日实验一 词法分析 1实验二 语法分析 3实验三 语义分析 4附录 5实验环境和工具 5MiniC语言 21实验一 词法分析一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)词

2、法分析器功能:主要作用是根据语言的词法规则对输入的源程序字符流进行分析,识别出一个个的单词(lexeme), 再将个单词对应的词法记号(token)一次提供给语法分析器,这些记号作为语言语法的终结符。 内容:设计、编制并调试一个Minic词法分析子程序,完成识别语言单词的任务;部分单词的BNF表示(可参考教材43页的状态转换图)- -|- - |- +- - - =要求:1. 用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。2. 输出的结果要记录每个token在程序中所在行号。3.各种单词符号的种别码,如下表1所示,是一种符号一个编码的设计4.输出结果要输出符号在程序中所在的行号。

3、5. 在完成分析的基础上,时间充分的情况下,开发出GUI界面,把输出的结果在界面上显示出来,并写到文件中。如源程序为C语言。输入如下一段:main() int a,b;a = 10; b = a + 20;要求输出下(2,“main” , “line=1”)(26,“(” , “line=1”)(27,“ )” , “line=1”)(30,“ ” , “line=2”)(1,“int” , “line=3”)(10,“a” , “line=3”)(32,“,” , “line=3”)(10,“b” , “line=3”)(34,“;” , “line=3”)(10,“a” , “line=4

4、”)(21,“=” , “line=4”)(20,“1010” ,“line=4” )整型常量编码为41,值为二进制表示(34,“;” , “line=4”)(10,“b” , “line=5”)(21,“=” , “line=5”)(10,“a” , “line=5”)(22,“+” , “line=5”)(20,“10100”,“line=5” )整型常量编码为41,值为二进制表示(34,“;” , “line=5” )(31,“” , “line=5” )表1符号种别码单词符号种别码单词符号种别码main228int129char330If431else5,32for6:33while7

5、;34ID标识符1035NUM常数20=37+22424344实验二 语法分析一、实验目的: 设计MiniC的上下文无关文法,利用JavaCC生成调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、语法分析器: 按照MiniC语言的语法规则检查词法分析输出的记号流是否符合这些规则,并根据这些规则所体现出的语言中的各种语法结构的层次性。把规则写入到JavaCC的 .jjt文件中,可以生成树状的层次结构。三、JavaCC: 在JavaCC的文法规范文件中,不仅可以描述语言的语法规范,而且可以描述词法规范,本次实习中,利用JavaCC以MiniC

6、语言构造一个不含语义分析的编译器前端,包括词法分析、语法分析,并要考虑语法分析中的错误恢复问题。通过使用JavaCC, 可以体会LL(k)文法的编写特点,掌握编写JavaCC文法规范文件的方法。内容:利用JavaCC生成一个MiniC的语法分析器;要求:1. 用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。2. 具有错误检查的能力,如果有能力可以输出错误所在的行号,并简单提示3. 如果输入的源程序符合MiniC的语法规范,输出改程序的层次结构的语法树4. 在完成分析的基础上,时间充分的情况下,开发出GUI界面,把输出的结果在界面上显示出来,并把语法树输出到界面。具体实施步骤如下:1

7、.把MiniC转换为文法如下 程序 main()语句块语句块语句串语句串语句;语句串|语句;语句赋值语句|条件语句|循环语句赋值语句 ID =表达式;条件语句 if条件语句块循环语句 while条件语句块条件(表达式关系符表达式)表达式表达式运算符表达式|(表达式)|ID|NUM运算符+|-|*|/关系符|! 2在eclipse环境下完成JavaCC的插件安装后,写一个JavaCC文法规范文件(扩展名为jj)3.开发GUI界面,完成的功能包括词法分析,语法分析(输出语法树),能够读文件,也能够在界面输入MiniC程序,也能够把输出的结果保存文件中。语法树可以保存图片,也可以把树的层次结果输出到

8、文件中。 实验三 语义分析一、实习目的通过上机实习,加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。二、实习要求采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。实习的输入和输出1输入语法分析提供的正确的单词串,输出四元式序列。例如:对于语句串:float r , h , s;s=2*3.1416*r*(h+r)2输出的四元式序列如下:(1) (*,2,3.1416,T1)(2) (*, T1, r, T2)(3) (+, h, r, T3)(4) (*, T2, T3, T4)(5) (=, T4, ,

9、s)附录实验环境和工具Java 集成开发环境由于实验中需要用到Eclipse的JDT工具包,故我们推荐使用Eclipse集成开发环境(IDE), 你可以从http:/www.eclipse .org/获得。它是一个广泛使用的开源集成开发环境。 推荐使用高版本的Eclipse.Java SDK你可以从SUN的网站()上获得Java软件开发包(SDK)。安装Java SE6.0(即JDK1.6)版本,并且将所安装的JRE添加到Eclipse的系统中,这样便于你跟踪调试Java源程序代码。Eclipse 的Java开发工具我们使用Eclipse的Java开发工具(JDT,Java Developme

10、nt Tools)提供的抽象语法树类层次结构来表示我们的AST。当用Eclipse编译依赖JDT的程序时,需要把Eclipse安装目录中plugins子目录下的几个与AST实现有关的jar文件(表1列举)导入到Eclipse的classpath中;当用JDK的javac和java编译、运行时,需要在”-classpath”选项中将这些jar文件夹包含进来。表1 Eclipse JDT AST相关的jar文件Eclipse版本号相关的jar文件3.2org.eclipse.core.resources_3.2.2.jarorg.eclipse.core.runtime_3.3.0.jarmon_

11、3.2.0.jarorg.eclipse.jdt.core_3.2.3.jarorg.eclipse.jdt.ui_3.2.2.jar3.3org.eclipse.core.resources_3.3.0.jarorg.eclipse.core.runtime_3.3.100.jarmon_3.3.0.jarorg.eclipse.jdt.core_3.3.1.jarorg.eclipse.jdt.ui_3.3.1.jarJflex这是词法分析器的生成器,它能根据jflex词法规范文件自动生成词法分析器的Java的源代码。可以从Jflex主页http:/jflex.de/(或JFlex 词法规

12、范利用Jflex工具进行词法分析分两步走:一是编写词法规范文件sample.flex(文件名,根据自己的情况来命名);二是对sample.flex 运行JFlex,产生词法分析器的Java 源代码,接着编译这个词法分析器,再运行这个词法分析器进行测试。 以编写英文字母序列和整数的词法规范文件sample.flex为例来阐述JFlex词法规范,sample.flex的编写如下:package pile.jflex;%line%column%public%class SampleLexer%type Symbol%eofval return Symbol.EOF;%eofval% public s

13、tatic void main(String argv) if (argv.length != 1) System.out.println(Usage: java Lexer inputfile); else SampleLexer l =null; try l = new SampleLexer(new java.io.FileReader(argv0); Symbol s = l.yylex(); while (s != Symbol.EOF) System.out.println(s); s = l.yylex(); catch (Exception e) System.out.prin

14、tln(Unexpected exception:); e.printStackTrace(); %:digit:+ return new Symbol(Symbol.INT, yytext(), yyline, yycolumn); :letter:+ return new Symbol(Symbol.WORD, yytext(), yyline, yycolumn); .|n sJFlex的词法规范文件由三部分组成,各部分之间通过由“%”开始的单行来分隔,即:用户代码%选项和声明%词法规则在词法规范的各个部分中,允许出现以“/*”开头和“*/”结尾的多行注释,以及以“/”开头的单行注释。不

15、过JFlex 的注释允许嵌套,因此你在使用时应保证“/*”和“*/”的数目要配对。用户代码第一部分所包含的用户代码将被直接复制到所生成的词法分析器源文件中的开头部分。这一部分可以放package 声明和import 语句。在这一部分中,也可以放自己的辅助类,如记号类,但是这并不是一个好的Java 编程风格,应该将这些辅助类单独放在自己的 .java 文件中。选项和声明词法规范文件的第二部分所包含的选项是用来定制你希望生成的词法分析器;而声明则是一些词法状态和宏定义的声明,它们将用于词法规范文件的第三部分,即词法规则中。每一条JFlex 指令必须放在一行的开始,并且由“%”字符引导,如:%cla

16、ss SampleLexer.常用的选项1、%class “classname”告诉JFlex 将生成的词法分析器类命名为“classname”,并且将生成的代码写到文件“classname.java”中。如果执行JFlex 命令时,没有使用“-d ”命令行选项,则生成的代码将被写到词法规范文件所在的目录中。如果词法规范中没有出现%class 指令,则生成的类将命名为“Yylex”,并且生成的代码将被写到文件“Yylex.java”中。在一个词法规范中只应有一条%class 指令。2、%extends “classname”这条指令使生成的类成为类“classname”的子类。在一个词法规范中

17、只应有一条%extends指令。3、%public这条指令使生成的类为public 类型。类似地,还有%final、%abstract 这些指令,它们分别使生成的类为final 或abstract 类型。4、%类代码指令该指令的格式是:%用户代码%其中的用户代码将被直接复制到生成的类中。在这里,你可以定义自己的词法分析器类中的成员变量和函数。如果词法规范中出现有多个类代码指令,则JFlex 依据这些指令在词法规范中出现的先后次序而将这些指令中的代码连接起来,再复制到生成的类中。5、%init%init初始化代码指令该指令的格式是:%init用户代码%init其中的用户代码将被直接复制到生成的类

18、的构造器中。在这里,可以初始化由%指令声明的成员变量。如果词法规范中出现有多个初始化代码指令,则这些代码按它们在词法规范中出现的先后次序而被连接起来。6、%buffer size这条指令用于设置扫描缓冲区的初始大小,缺省为163847、%function name这条指令用于设置词法扫描函数(或称为方法)的名称。如果在词法规范中没有出现这条指令,则扫描函数为“yylex”,例如sample.flex例子中8、%integer 或%int这两条指令均使扫描函数声明为int 类型,这样扫描函数就会返回int 值当作记号。在这种设置下,文件结束的缺省值为YYEOF,YYEOF 是生成的类中的一个pu

19、blic static final int型成员变量。9、%intwrap这条指令使扫描函数声明为Java 的包装类Integer 类型。这时,文件结束的缺省值为null。10、%type typename这条指令使扫描函数声明为指定的类型。例如,在sample.flex的例子中,扫描函数声明为Symbol类型。在这种设置下,文件结束的缺省值为null。如果typename不是java.lang.Object的子类,则你应该使用%eofval%eofval指令或规则来规定其他的文件结束值。11、%eofval%eofval文件结束值指令该指令的格式是:%eofval用户代码%eofval其中的

20、用户代码将被直接复制到扫描函数中,并且将在每次遇到文件结束时执行。这个用户代码应该返回表示文件结束的值,如sample.flex的例子中的return Symbol.EOF。在词法规范中只能有一个%eofval%eofval指令。12、%eof%eof文件结束代码指令该指令的格式是:%eof用户代码%eof其中的用户代码将在遇到文件结束时只执行一次。这个代码将被放在void yy_do_eof( )方法中,并且不应返回任何值;如果要返回值,则应使用%eofval%eofval指令或者规则。如果词法规范中出现多个文件结束代码指令,则这些代码应依照在规范中的出现次序而被连接在一起。13、%eofc

21、lose这条指令用来使JFlex 在文件结束处关闭输入流。代码yyclose( )被追加到方法yy_do_eof( )中,并且在这个方法的throws 子句中声明java.io.IOException 异常。14、%debug在生成的类中创建一个main 函数,它将从命令行中获得输入文件名,然后对这个输入文件运行词法分析器,并向Java 控制台打印输出每个返回记号的信息,直到遇到文件结束为止。所输出的信息包括:行号(如果设置了%line)、列号(如果设置了%column)、匹配的文本、执行的动作(含词法规范中的行号)。15、%char这条指令用来使JFlex 返回字符计数。int 型成员变量y

22、ychar 包含从输入开始到当前记号开始处的字符数(从0 开始计数)。16、%line这条指令用来使JFlex 返回行计数。int 型成员变量yyline 包含从输入开始到当前记号开始处的行数(从0 开始计数)。17、%column这条指令用来使JFlex 返回列计数。int 型成员变量yycolumn 包含从当前行开始到当前记号开始处的字符数(从0 开始计数)。声明声明包括状态声明和宏定义两类。状态声明状态声明有以下格式:%state 状态标识符 ,状态标识符, %xstate 状态标识符 ,状态标识符, 前一种用来包含状态,后一种则用来去掉状态。在词法规范中可以包含多行状态声明,每一行都从

23、%state 或%xstate 开始(或者是从%s 或%x 开始)。状态标识符是以字母开头的、后跟字母、数字或下划线组成的字符序列。状态标识符可以用逗号或空白分隔。宏定义宏定义的格式如下:宏标识符 = 正规式按照这种形式定义的宏标识符稍后可以被引用。右边(RHS, right hand side)的正规式必须是合式的(well formed),并且不能包含“”、“/”或“$”运算符。词法规则词法规则部分包含一组正规式和词法匹配后要执行的动作(Java 代码)。在词法分析器读取输入时,它会查看所有正规式,按最长匹配选择匹配的正规式,并执行该正规式对应的动作。词法规则的语法和语义用BNF 文法给出

24、了词法规则部分的语法定义。这里列出部分重要的产生式。Rule : = StateList RegExp LookAhead Action| StateList Action| StateGroupStateList := LookAhead := $ | / RegExpAction := JavaCode | |RegExp := RegExp | RegExp / 两个正规式的或运算| RegExp RegExp / 两个正规式的连接运算| ( RegExp ) / 即匹配RegExp| ! RegExp / 正规式的否定运算| RegExp / 匹配任何文本直到第一次匹配RegExp|

25、RegExp Number , Number / RegExp 的重复次数| (Character | Character - Character)* | PredefinedClass| Identifier | StringCharacter+ | Character其中: 在词法规则中,除了用正规式来描述外,还可以用一个可选的StateList 来进一步细化词法规则。StateList 是一个词法状态列表,它就像是一个开始条件。例如,如果词法分析器处在STRING 词法状态,则只有那些由开始条件引导的正规式可以被匹配。词法状态YYINITIAL 是预定义的,也是词法分析器启动扫描时所处的

26、状态。如果一个正规式没有指定StateList,则它将在所有词法状态上匹配。 Number 是非负的十进制整数。 Identifier 是一个字母a-zA-Z后跟0 个或多个字母、数字或下划线a-zA-Z0-9_。 转义序列包括:1) n、r、t、f 和b;2)x 后跟两个十六进制数字a-fA-f0-9,或者反斜杠后跟从000 到377 的三个八进制数字,表示标准的ASCII 转义序列;3)u后跟四个十六进制数字a-fA-f0-9,表示unicode 转义序列;4)反斜杠后跟其他任何unicode 字符,代表这个字符。 Character 是不包含下面字符之一的转义序列或任何unicode 字

27、符:| ( ) . * + ? $ / StringCharacter 是不包含下面字符之一的转义序列或任何unicode 字符: 正规式 r 前面加上运算符,表示r 只在输入的每行开始进行匹配。 正规式 r 后跟上$运算符,表示r 只在输入的每行结尾进行匹配。 假设 r1 和r2 是正规式,则r1/r2 表示r1 匹配的文本必须是定长的,或者r2 的内容的开始不匹配r1 的尾部。例如,abc / a|b 是合法的,因为abc是定长的;a|ab / x* 也是合法的,因为x*的前缀不匹配a|ab的后缀;x|xy / yx是非法的,因为x|xy的后缀y也是yx的前缀。 StateList 动作代码这条规则与%eofval 指令十分类似,其不同在于规则前可以放可选的StateList。在遇到文件结束并且词法分析器当前处于StateList 中的某一词法状态时,执行动作代码。 PredefinedClass 规定JFlex 中的以下预定义的字符类:“.” 包含除n 外的所有字符“:jletter:” 由java.lang.Character.isJavaIdentifierStart( )决定的字符类“:jletterdigit: ”

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1