- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaCC入门
JavaCC 入门
1.????? JavaCC 和分析器生成程序
JavaCC 是一个能生成语法和词法分析器的生成程序。语法和词法分析器是字符串处理软件的重要组件。编译器和解释器集成了词法和语法分析器来解释那些含有程序的文件,不管怎样,词法和预防分析器被广泛用于各种应用,所以我希望这本书中的示例能阐述清楚。那么什么是词法和语法分析器呢?词法分析器能把一串字符切分成一溜叫做token 的子串并把它们归类。看一个用C 语言写的小程序。
?
int main() {
return 0 ;
}
?
C 编译器的词法分析器会把上面的程序切割成下面的一串token
“int”, “ ”, “main”, “(”, “)”,
“ ”, “{”, “\n”, “\t”, “return”
“ ”, “0”, “ ”, “;”, “\n”,
“}”, “\n”, “” .
词法分析器还会识别每个token 的类型;在这个例子中这个token 串的类型可能是
KWINT, SPACE, ID, OPAR, CPAR,
SPACE, OBRACE, SPACE, SPACE, KWRETURN,
SPACE, OCTALCONST, SPACE, SEMICOLON, SPACE,
CBRACE, SPACE, EOF .
EOF 这种token 表示输入文件结束。Token 流将会传给分析器。在这个C 语言的例子中,分析器并不需要所有的token;本例那些被归为SPACE 的 token 不会传给分析器。分析器将会分析token 流以决定程序的结构。通常在编译器中,分析器输出一棵代表程序结构的树。这棵树将会作为编译器语法分析和代码生成的输入的一部分。考虑某个程序里的一个语句:
fahrenheit = 32.0 + 9.0 * celcius / 5.0 ;
分析器根据语法规则分析这个表达式并生成一棵树:
?
?
如果输入不遵循语言的词法或句法规则,词法分析器同时也负责产生出错信息。
JavaCC 本身并不是一个词法分析器或是语法分析器,而是一个分析程序生成器。这就是说它可以根据输入的语言规范输出一个词法和语法分析器。JavaCC 生成的是用Java 写成的词法和语法分析器。见下图TBD:
DIAGRAM TBD
JavaCC 这一点分析程序生成器时,处理整数的规则和处理浮点数的是分开书写的,而它们之间公共的代码在生成器处理时被抽取出来了。模块性的增加意味着语言规范比手写的Java 程序更容易编写、阅读和修改。通过使用JavaCC 这样的分析程序生成器,使软件工程师节约了不少时间,同时也增强了所编写软件的质量。
2.????? 第一个例子——整数相加
作为第一个例子,我们把一串数字加起来,像这样
99 + 42 + 0 + 15
我们忽略所有数字和符号间的空格和换行符,除此之外,我们不接受除了10个数字和加号之外的其他字符。
本节后面的代码都出自一个叫“adder.jj”的文件。这个文件含有符合JavaCC 规范的词法和语法说明,用来作为JavaCC 的输入。???
文件的第一部分?
/* adder.jj Adding up numbers */
options {
STATIC = false ;
}
PARSER BEGIN(Adder)
class Adder {
public static void main( String[] args )
throws ParseException, TokenMgrError {
Adder parser = new Adder( System.in ) ;
parser.Start() ; }
}
PARSER END(Adder)
?
在第一个注释之后的是选项段;除了STATIC 这一项(缺省为true),所有其他的JavaCC选都为默认值。关于JavaCC 选项的更多信息,请参考JavaCC 的文档、本书的以后的章节和FAQ。接下来定义了一个叫做Adder 的Java 类,但在这你所看到的不是Adder 类的全部;JavaCC 会在处理时为这个类添加其他代码。main 方法宣称可能在运行时隐式的抛出两个异常:ParseException? 和TokenMgrError;这些类都会由JavaCC生成。
2.2.? 详述词法分析器
我们待会儿再看那个main函数,现在我们首先来定义一个词法分析器。在这个简单的例子中,词法分析器的定义只有4行:?
SKIP : ?{ ” ” }
SKIP : ?{ ”\n” | ”\r” | ”\r\n” }
TOKEN : { PLUS : ”+” }
TOKEN : { NUMBER : ([”0”-”9”])+ }
?
第一行说明了空格是
文档评论(0)