欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 毕业论文 > 计算机毕业论文

用 CUP 构 造 编 译 器 的 方 法_分析器生成器-论文网

时间:2013-11-30  作者:李超
这一段提供多种预先声明来指定如何产生分析器,并提供运行时的代码。这个段是可选的,并不一定要被包含在一个CUP源文件中。对于我们的计算器,在这个段中有两个项。第一项是一个包声明,然后是导入类声明。其它可选的预先声明项都以若干关键字和“{:”开始,以“:}”结尾,所有的java代码都写在中间。所有这些java代码会被直接复制到产生的分析器的类定义中,这些选项主要有“parsercode”、“initwith”、“scanwith”等。

(2)符号列表

这个段包括终结符和非终结符的列表,并为每个终结符和非终结符提供类型。这个段是CUP源文件必需的。终结符声明的语法是:

terminalClassnamenamel,name2,……;

Classname是符号对应的java类型,如:Integer。如果不写Classname,则被认为是Object类型。在Classname后面罗列声明为该类型的终结符的名字,各终结符以逗号分隔,例如:

terminalUMINUS,LPAREN,RPAREN;

terminalIntegerNUMBER;

注意,这里只有NUMBER有一个相应的类型。在我们的例子里,它是唯一有值的终结符。例如,当词法分析器识别了一个PLUS符号,就会把表示终结符PLUS的代码传递给语法分析器;但是当它识别了一个NUMBER,它不仅要传递表示终结符NUMBER的代码,还要将其具体的值一同传递。

非终结符以同样的方式声明。唯一的区别是声明以nonterminal起始,以表明它是一个非终结符。

(3)终结符的优先级和结合性

这个段指明终结符的优先级和结合性,它是可选的段。本段主要用于处理二义文法。虽然,可以通过调整语法结构使它没有二义性来省略本段,但是,用二义性文法的LR分析和同样语言非二义性文法的LR分析相比可提高对输入串分析的速度。

当给出了二义性文法终结符之间的优先关系和结合性的规定后,可能会解决LR项目集中的冲突。例如,TIMES应该有比PLUS高的优先级。当语法分析器遇到一个语句比如5+4*3,它不知道这个表达式应该按照5+(4*3)计算还是按照(5+4)*3计算。为了用这个段消除这种二义性,需要如下来声明优先级。最高的优先级从列表的底部,向上递减。left表示在那个优先级中终结符的结合性是从左到右。例如:

precedenceleftPLUS,MINUS;

precedenceleftTIMES,DIVIDE;

由此,语法分析器知道该表达式应该按照5+(4*3)计算。

(4)语法规则

CUP源文件的最后是语法规则。语法中的每一个产生式的中间是“::=”,它将整个产生式分割为左右两边,左边是一个非终结符,右边是零或多个终结符、非终结符和内嵌java代码,内嵌的java代码放在一对定界符{:和:}之间,最后以一个分号结束,右边的符号都可以有标号。例如:

expr::=expr:elPLUSexpr:e2

{:RESULT=newInteger(e1.intValue()+e2.intValue());:}

产生式右边第一个非终结符expr有个标号e1,第二个有个标号e2。而产生式左边总是有隐含的标号RESULT。

在运行时,所有产生式中出现的符号都会由一个分析栈中的一个Symbol类的对象来表示。各标号就是这些对象的实例变量值的引用。在表达式expr:elPLUSexpr:e2中,e1、e2都是Integer类型对象的引用,这些对象都位于分析栈中表示这些非终结符的Symbol类型对象的值域中。产生式中RESULT也是Integer类型的,因为expr被声明为Integer类型。这个对象成为一个新的Symbol对象的实例变量值。

2.3与词法分析器(扫描器)的整合

新版本的CUP对扫描器的整合作了重大改进,使得CUP与JLex、JFlex等自动生成的扫描器结合得更好。改进后的CUP要求扫描器必须实现如下接口:

packagejava_cup.runtime;

publicinterfaceScanner{

publicSymbolnext_token()

throwsjava.1ang.Exception;

}

由于我们的计算器的例子十分简单,可以直接手工编写出一个扫描器。对于复杂的语法,可以利用JFlex之类的工具自动生成。

2.4CUP的出错恢复机制

下面简单地介绍一下CUP的出错恢复机制,CUP使用了与YACC一样的局部出错恢复机制。LR分析表包含移进、归约、接收和出错动作。当分析器遇到出错动作时将停止分析并报告出错。这种做法可能对程序员是很不友好的,因为程序员希望分析器能够报告程序中所有的错误,而不仅仅是一个。局部出错恢复机制的原理包括:检测出错位置,允许分析器依据自己的判断来调整栈和输入。

查看相关论文专题
加入收藏  打印本文
上一篇论文:莆田广电中心硬盘播出系统及实践_系统构成-论文网
下一篇论文:F平台的基本构成及其对软件架构发展的推动_模式-论文网
毕业论文分类
行政管理毕业论文 工商管理毕业论文
护理毕业论文 会计毕业论文
会计专业毕业论文 英语专业毕业论文
大学毕业论文 硕士毕业论文
计算机毕业论文 市场营销毕业论文
物流管理毕业论文 法学毕业论文
相关计算机毕业论文
    无相关信息
最新计算机毕业论文
读者推荐的计算机毕业论文