- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
TheavaCCTutorial附源程序(转)
JavaCC 简介
JavaCC 与解析器生成器
JavaCC是一个解析器生成器和词法分析生成器。解析器和词法分析器用于处理输入的字符串。编译器和解释器被用来和解析器/词法分析器一起处理文件中的程序。但是解析器/词法分析器在实际中有更加广泛的应用,正如我在本文中希望介绍的一样。 那么,什么是解析器/词法分析器?词法分析器可以吧一个字符串分离成若干叫做“Token”的子字串,并同时对这些Token进行分类。考虑下面的程序:
int main(){? ? ? ? return 0;}
一个C语言的词法分析器将会把这段代码分离成下列子串:
int \s main ( ) \s { \n \t
return \s 0 \s ; \n } \n \s 同时,它会对这些子串分类,在本例中分类结果是:
KWINT SPACE ID OPAR CPAR SPACE OBRACE SPACE SPACE
KWRETURN SPACE OCTALCONST SPACE SEMCOLON SPACE CBRACE SPACE EOF EOF表示文件(输入)结束,这些Token串将会被送到解析器,在C语言中,解析器并不需要所有这些Token,本例中的分类为SPACE的token就被忽略了。解析器将会分析这些Token串来决定程序的结构。通常在编译器中,解析器输出的是程序的树状结构。这个树会被编译器中的代码生成模块处理。考虑程序中的一个语句:
F=32.0+9.0*C/5.0
解析器将分析这个语句并根据规则生产下面的树:
MISSING PIC
如果输入不符合目标词法和词法时,词法分析器和解析器同时也负责生产错误信息。 JavaCC本身并不是一个词法分析器或者解析器而是一个代码生成器,这意味着它可以根据输入的语言定义输出一个词法分析器和解析器。JavaCC输出的代码是合法的可编译Java代码。 解析器和词法分析器本身就是一个冗长而复杂的组件,手工编写一个这样的程序需要仔细考虑各条件的相互作用,例如分析C语言时,处理整数的代码不可能和处理浮点的代码相互独立,因为整数和浮点数的开头都是数字。而使用像JavaCC这样的分析器生成器时处理整数的规则和处理浮点数的规则是分开书写的,而两者之间的共享代码在代码生成是被自动添加了。这就增强了程序的模块性,同时也意味着定义文件较手工编写的Java代码来说更加易于编写,阅读和更改。通过JavaCC这样的解析器生成器,程序员们能节省更多时间,同时也能增加编写的软件的质量。
第一个例子——我们来做加法吧!
作为第一个例子,我们将计算一连串整数的加法,请看下面的例子:
99+42+0+15
我们忽略所有数字和符号间的空格和换行符,除此之外,我们不接受除了10个数字和加号之外的其他字符。 这一节的剩下的部分中的代码都是文件adder.jj的一部分。这个文件包含了符合JavaCC词法的解析器/词法分析器的定义,并且将作为JavaCC程序的输入文件。
选项和类定义
这个文件的第一部分是:
/*adder.jj 吧一堆数字相加*/options{? ? ? ? STATIC = false;}PARSER_BEGIN(Adder)public class Adder{? ? ? ? public static void main(String[] args) throws ParseException, TokenMgrError{//作者这里没有加public,这会在某些情况下产生错误(译注)? ? ? ? ? ? ? ? Adder parser = new Adder(System.in);? ? ? ? ? ? ? ? parser.Start();//方法名竟然是大写开头的,真不地道(翻译吐槽)? ? ? ? }}PARSER_END(Adder)
开头部分的options节说明了除了我们明确指定的STATIC选项,所有其他的JavaCC选项为都默认值。关于JavaCC选项的详细信息,请参考JavaCC文档。接下来我们定义了一个名为Adder的Java类,但是我们并没有写出这个类的全部代码,JavaCC会在处理时自动生成其他的代码。main方法声明抛出的ParserException和TokenMgrError有可能在执行这些代码时被抛出。
指定一个词法解析器吧!
我们待会儿在看那个main函数,现在我们首先来定义一个词法分析器。在这个简单的例子中,词法分析器的定义只有下面4行:
SKIP:{“ “}SKIP:{“\n”|”\r”|”\r\n”}TOKEN:{ PLUS : “+”}TOKEN:{ NUMBER : ([“0”-“9”])+ }
第一行说明了空格是一个token,但
文档评论(0)