JavaCC基本使用介绍.docxVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaCC基本使用介绍

JavaCC基本使用介绍目录一、引言21.1 JavaCC简介:21.2 词法分析器概念21.3 语法分析器概念31.4 JavaCC采取的语法分析方法3二、示例使用流程62.1加法解析器62.2 扩展的加法解析器102.3 计算器解析器122015年1月2日星期五一、引言1.1 JavaCC简介:JavaCC(Java Compiler Compiler)是一个用JAVA开发的能生成词法和语法分析器的工具。这个工具可以读取上下文无关且有着特殊意义语法的文本输入并把它转换成可以识别该语法的JAVA程序。JavaCC可以在JVM 1.2或更高的版本上使用,它由纯Java代码开发,可以在多种平台上运行。JavaCC还提供JJTree工具来帮助我们建立语法树,JJDoc工具为我们的源文件生成BNF范式(巴科斯-诺尔范式)文档(Html)。1.2 词法分析器概念词法分析器又称扫描器。词法分析是指将我们编写的文本输入流解析为一个个的记号(Token),分析得到的记号以供后续/view/487037.htm \t _blank语法分析使用。词法分析器的工作是低级别的分析,就是将一系列字符分成一个个的Token,并标记Token的分类。例如:输入:int main() {return 0; }输出:“int”, “ ”, “main”, “(”, “)”, “ ”, “{”, “\n”, “\t”, “return”, “ ”, “0”, “;”, “\n”, “}”工作流程如图1所示:图1:词法分析器工作流程1.3 语法分析器概念语法分析(Syntacticanalysis or Parsing)是根据某种给定的形式文法对由单词序列构成的/view/1140843.htm \t _blank输入文本进行分析并确定其语法结构的一种过程。/view/135635.htm \t _blank语法/view/239473.htm \t _blank分析是编译过程的一个/view/1838.htm \t _blank逻辑阶段。简单来说:/view/135635.htm \t _blank语法/view/239473.htm \t _blank分析的/view/135914.htm \t _blank任务就是在/view/487040.htm \t _blank词法分析的基础上将/view/419292.htm \t _blank单词序列组合成各类语法短语,判断输入在结构上是否正确。工作流程如图2所示:图2:语法分析器工作流程1.4 JavaCC采取的语法分析方法JavaCC采用的是自顶向下的分析方法,而且没有回溯功能,因此如何解决冲突的问题,是程序员的责任。关于语法分析方法的分类如图3所示:图3:语法分析方法简单分类什么是自顶向下的分析方法?什么是自底向上的分析方法?请看图4,图5示例。图4:自顶向下的分析方法 图5:自底向上的分析方法自顶向下的分析法会遇到的问题:(1)存在形如A→αβ1|αβ2的产生式,即有多个候选式的前缀相同(称为公共左因子,或左因子),则可能造成虚假匹配,使得在分析过程中可能需要进行大量回溯。(2)存在左递归(文法中有形如A→Aα的产生式),分析过程又使用最左推导,就会使分析过程陷入死循环 。左递归的类型:直接左递归:A→A…间接左递归:A→Bβ,B→Aα 即A→+A…潜在左递归:A→αAβ,且α→*ε针对上述问题的一些解决方法:(1)关于公因子的问题,可以改写算法(提取公因子),也可以通过展望(look ahead)更多符号的方法来解决。例将形如:A→αβ1|αβ2|…|αβn|γ1|γ2|…|γm,改写为:A→αA′|γ1|γ2|…|γm,A′→β1|β2|…|βn。(2)关于左递归的问题,一般采用经典的修改文法的方法解决。消除直接左递归:假定关于A的全部产生式是:A→Aα1|Aα2|…|Aαm|β1|β2|…|βn消除直接左递归后改写为:A→β1 A′|β2 A′|…|βn A′A′→α1 A′|α2 A′|…|αm A′|ε消除间接左递归:去除那些从开始符号出发永远无法到达的非终结符号的产生规则,为非终结符号编号,再采用代入法将间接左递归变为直接左递归,从而再消除直接左递归。当在JavaCC中碰到冲突时,可以采用下面的方法之一解决问题:(1)修改语法,使之成为LL(1)语法。(2)只要将LOOKAHEAD=k写到Options块中即可。JavaCC产生的分析器就可以分析LL(K)语法生成的语言。采用第一种方法的好处是效率非常高,易于维护;采用第二种方法的好处是语法更加直观,但是却不易维护。有时候采用第一种方法是无法解决冲突的,第二种方法是唯一的选择。什么是LL(1)语法?第一个L代表从左向右扫描输入符号串,第二个

文档评论(0)

weixin98 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档