资源描述:
《JavaCC基本使用介绍.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaCC基本使用介绍目录一、引言21.1JavaCC简介:21.2词法分析器概念21.3语法分析器概念31.4JavaCC采取的语法分析方法3二、示例使用流程62.1加法解析器62.2扩展的加法解析器102.3计算器解析器122015年1月2日星期五一、引言1.1JavaCC简介:JavaCC(JavaCompilerCompiler)是一个用JAVA开发的能生成词法和语法分析器的工具。这个工具可以读取上下文无关且有着特殊意义语法的文本输入并把它转换成可以识别该语法的JAVA程序。JavaCC可以在JVM1.2或更高的版本上使用,它由纯J
2、ava代码开发,可以在多种平台上运行。JavaCC还提供JJTree工具来帮助我们建立语法树,JJDoc工具为我们的源文件生成BNF范式(巴科斯-诺尔范式)文档(Html)。1.2词法分析器概念词法分析器又称扫描器。词法分析是指将我们编写的文本输入流解析为一个个的记号(Token),分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析,就是将一系列字符分成一个个的Token,并标记Token的分类。例如:输入:intmain(){return0;}输出:“int”,“”,“main”,“(”,“)”,“”,“{”,“”,“
3、t”,“return”,“”,“0”,“;”,“”,“}”工作流程如图1所示:图1:词法分析器工作流程1.3语法分析器概念语法分析(SyntacticanalysisorParsing)是根据某种给定的形式文法对由单词序列构成的输入文本进行分析并确定其语法结构的一种过程。语法分析是编译过程的一个逻辑阶段。简单来说:语法分析的任务就是在词法分析的基础上将单词序列组合成各类语法短语,判断输入在结构上是否正确。工作流程如图2所示:图2:语法分析器工作流程1.4JavaCC采取的语法分析方法JavaCC采用的是自顶向下的分析方法,而且没有回溯功能
4、,因此如何解决冲突的问题,是程序员的责任。关于语法分析方法的分类如图3所示:图3:语法分析方法简单分类什么是自顶向下的分析方法?什么是自底向上的分析方法?请看图4,图5示例。图4:自顶向下的分析方法图5:自底向上的分析方法自顶向下的分析法会遇到的问题:(1)存在形如A→αβ1
5、αβ2的产生式,即有多个候选式的前缀相同(称为公共左因子,或左因子),则可能造成虚假匹配,使得在分析过程中可能需要进行大量回溯。(2)存在左递归(文法中有形如A→Aα的产生式),分析过程又使用最左推导,就会使分析过程陷入死循环。左递归的类型:直接左递归:A→A…间接左递
6、归:A→Bβ,B→Aα即A→+A…潜在左递归:A→αAβ,且α→*ε针对上述问题的一些解决方法:(1)关于公因子的问题,可以改写算法(提取公因子),也可以通过展望(lookahead)更多符号的方法来解决。例将形如:A→αβ1
7、αβ2
8、…
9、αβn
10、γ1
11、γ2
12、…
13、γm,改写为:A→αA′
14、γ1
15、γ2
16、…
17、γm,A′→β1
18、β2
19、…
20、βn。(2)关于左递归的问题,一般采用经典的修改文法的方法解决。消除直接左递归:假定关于A的全部产生式是:A→Aα1
21、Aα2
22、…
23、Aαm
24、β1
25、β2
26、…
27、βn消除直接左递归后改写为:A→β1A′
28、β2A′
29、…
30、βn
31、A′A′→α1A′
32、α2A′
33、…
34、αmA′
35、ε消除间接左递归:去除那些从开始符号出发永远无法到达的非终结符号的产生规则,为非终结符号编号,再采用代入法将间接左递归变为直接左递归,从而再消除直接左递归。当在JavaCC中碰到冲突时,可以采用下面的方法之一解决问题:(1)修改语法,使之成为LL(1)语法。(2)只要将LOOKAHEAD=k写到Options块中即可。JavaCC产生的分析器就可以分析LL(K)语法生成的语言。采用第一种方法的好处是效率非常高,易于维护;采用第二种方法的好处是语法更加直观,但是却不易维护。有时候采用第一种方法是无法解
36、决冲突的,第二种方法是唯一的选择。什么是LL(1)语法?第一个L代表从左向右扫描输入符号串,第二个L代表产生最左推导,1代表在分析过程中执行每一步推导都要向前查看一个输入符号。LL(1)文法既不是二义性的,也不含左递归,对LL(1)文法的所有句子均可进行确定的自顶向下语法分析。LL(1)语法的具体定义(不必详究):对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A—>α
37、β满足下列条件:(1)如果α、β均不能推导出ε,则FIRST(α)∩FIRST(β)=Φ。(2)α和β至多有一个能推导出ε。(3)如
38、果β*═>ε,则FIRST(α)∩FOLLOW(A)=Φ。将满足上述条件的文法称为LL(1)文法。基于LL(1)文法的分析过程(不必详究):给定LL(1)文法,对输