`
zhoujinhuang
  • 浏览: 93487 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVACC 入门(转载)

阅读更多
 

读了JavaCC自带文档中的SimpleExamples之后,有一点心得,于是总结一下,以备遗忘。

 

JavaCC的输入文档是一个词法和语法的规范文件,其中也包括一些动作的描述,它的后缀应该是jj

 

简而言之,一个jj文档由下面几个部分构成:

l         Options{}部分:这个部分对产生的语法分析器的特性进行说明,例如向前看的token的个数(用来解除冲突)。这一部分是可以省略的,因为每一个选项都有默认值,当我们没有对某个选项进行说明时,它就采用默认值。也可以把这些选项作为javacc命令的参数来启动javacc,可以达到同样的效果。

l         分析器类的声明:这个部分指定了分析器类的名字,以及其他类中成员的声明。这个部分是必须有的。这个部分的声明如下:

PARSER_BEGIN(classname)

Class classname {

       ……

}

PARSER_END(classname)

l         词法部分声明:这里面有四类:SKIPTOKENSPECIAL_TOKENMORE。其中,SKIP用来说明被忽略的串,下面是一个例子:

SKIP {

       “ “

|

       “\n”

|

       “\r”

}

TOKEN用来说明在词法层次上识别的token,下面是一个例子:

TOKEN {

       <ID: (“a”-“z”|”A”-“Z”)+>

|

       <NUM: (“0”-“9”)+>

}

       这个部分是可以省略的。

在词法声明部分,以#开头的token只是在词法分析时使用,不能作为语法分析的输入,也就是说,它相对词法分析是局部的。

l         语法声明和动作代码:这一部分生成的代码会直接插入分析器类声明的结束括号之前。一般而言,语法中的每一个非终结符都对应一个函数,其中函数的形式如下:

Return_type function_name()

{     变量声明和一些初始化的动作

}

{

       上下文无关文法的右部分,其中每个组成部分的形式如下:

       语法部分 {动作部分}

两个部分都可以省略。语法部分可以是一个字符串(简单的token常常可以这样处理),TOKEN中声明的token,或一个对某个非终结符对应的函数的调用。

}

 

以上说明的是jj文件的组成部分,下面再说明一下jj文件中语法的表示方法。Javacc中的语法表示吸收了UNIX中正规文法的一些记号,下面是一些:

l         []:其中的内容是可选的。

l         +:前面的内容出现一次或多次。

l         -:前后构成的闭区间。

l         *: 前面的内容出现0次或多次。

l         ?:前面的内容出现0次或一次。

l         ~:后面的内容的补。

l         |:前面或后面。

l         ():改变运算的优先级,把其中的内容作为一个整体。

 

很遗憾的是,javacc有一些问题,即它采用的是自顶向下的分析方法,而且没有回溯功能,因此如何解决冲突的问题,是程序员的责任。Javacc产生的程序采用的分析方法既不是纯正的递归下降算法(可以回溯),也不是纯正的LL算法,事实上,它和二者既有联系又有区别。

 

与递归下降算法相比,它们的共同点是都采用了函数来表示对应的非终结符,通过函数调用来表示非终结符之间的组成关系。二者之间的不同点在于javacc没有回溯能力,也就是说,如何展开非终结符在编译时就已经确定了。

 

LL算法算法相比,它们的共同点是如何展开非终结符都是静态确定的(javacc是函数调用,LL是展开表),事实上,采用缺省选项的javacc的语言是LL(1)的语言。不同之处在于,前者采用的是函数调用,后者采用的是栈上展开的方法。

 

因为javacc的基础是自顶向下的分析方法,所以必须要解决的下面的两个问题:左递归和公因子。关于左递归的问题,一般采用经典的修改文法的方法解决。关于公因子的问题,可以改写算法(提取公因子),也可以通过展望(look ahead)更多符号的方法来解决。但是因为javacc扩展了经典的BNF,因此它面临更多的问题。总之,当在编译时碰到冲突问题时,就说到了一个choice point

 

可以将javaccchoice point归结为以下几类:

l         由选择算子|引入的冲突,

l         由可省略算子[]或?引入的冲突

l         由重复算子*引入的冲突

l         由重复算子+引入的冲突

 

当在javacc中碰到冲突时,可以采用下面的方法之一解决问题:

l         修改语法,使之成为LL(1)语法。这个方法有一个问题:修改后的语法可能非常不直观了L

l         jj文件中给javacc一些提示。这些提示可以根据展望的作用域分成全局提示和部分提示。要采用全局提示,只要将LOOKAHEAD=k写到Options块中即可(当然也可以写到javacc的命令行里),这样javacc产生的分析器就可以分析LL(K)语法生成的语言。也可以设置一个局部的LOOKAHEAD,这样既保持了LL(1)的高效性,又可以解决choice point中的。LOOKAHEAD的局部声明形式是LOOKAHEAD(…),其中括号中的可以是数字(说明向后看多少个记号),或者是一个表示文法的串(当成功时选择)。LOOKAHEAD的完整形式为LOOKAHEAD(amount, expansion, {java语言里的逻辑表达式}),它的含义是,如果到达amount个记号后,expansion如果仍然成立,且逻辑表达式也成立,则执行下面的展开。

 

采用第一种方法的好处是效率非常高,对机器友好,易于维护,采用第二种方法的好处是语法更加直观,但是却不易维护。有时候采用第一种方法是无法解决冲突的,第二种方法是唯一的选择。

分享到:
评论
2 楼 rovanz 2010-01-31  
lin23871 写道


lin23871 写道



lin23871 写道




lin23871 写道




lin23871 写道





lin23871 写道





lin23871 写道





lin23871 写道




lin23871 写道




lin23871 写道




lin23871 写道





lin23871 写道




lin23871 写道




lin23871 写道




lin23871 写道




lin23871 写道



lin23871 写道

相关推荐

    JavaCC入门详解.docx

    【JavaCC入门详解】 JavaCC(Java Compiler Compiler)是一种基于Java的词法分析器和语法分析器生成器,常用于构建解析器和编译器。它允许开发者使用规范的语法描述语言来定义语言的结构,然后自动生成解析器代码,...

    javaCC入门文档

    ### JavaCC 入门知识点详解 #### 一、JavaCC简介 JavaCC(Java Compiler Compiler)是一款用于构建解析器的工具,尤其适用于那些希望开发编译器、解释器或脚本引擎的程序员。通过JavaCC,用户可以轻松地实现语法...

    JavaCC/JJTree入门

    NULL 博文链接:https://nemogu.iteye.com/blog/1508996

    JavaCC文档及部分翻译

    JavaCC,全称为Java Compiler Compiler,是一款强大的工具,用于生成Java源代码的解析器和词法分析器。它是基于LL(k)语法分析方法的,支持自定义语法,并且可以处理复杂的语言结构。JavaCC在软件工程领域,尤其是...

    JavaCC

    JavaCC,全称为Java Compiler Compiler,是一款强大的工具,主要用于生成解析器和词法分析器,尤其是在处理复杂的语法和解析任务时。它是一个基于Java的开源软件,被广泛应用于构建编译器、解释器以及各种语言处理...

    javacc 词法分析器

    JavaCC(Java Compiler Compiler)是一种强大的词法和语法解析工具,用于生成Java源代码的解析器和词法分析器。这个工具广泛应用于处理结构化文本输入,如编程语言、配置文件或者任何需要解析的定制语言。JavaCC的...

    javacc-4.0以及 javacc-5.0下载

    JavaCC(Java Compiler Compiler)是Java语言的一个开源工具,用于生成词法分析器(lexical analyzers)和语法分析器(parsers)。它基于LL(k)语法解析策略,允许开发者使用简洁的BNF(巴科斯范式)语法来定义语言或...

    javacc学习的心得

    ### JavaCC 学习心得与应用详解 #### 一、编译工具的发展历程与功能概述 编译工具作为计算机科学中的重要组成部分,在软件开发中扮演着至关重要的角色。随着计算机技术的发展,编译工具也在不断地进化和完善。最早...

    javacc eclipse_1.5.24.zip javacc插件

    2. **文档**:可能包含插件的用户手册、API参考文档或者快速入门指南,帮助开发者了解如何使用插件以及其功能。 3. **示例**:可能包含一些示例项目或测试用例,展示如何利用插件创建和测试词法分析器和解析器。 4. ...

    javacc语法分析.zip

    JavaCC(Java Compiler Compiler)是Java语言的一个开源工具,用于生成词法分析器(Lexer)和语法解析器(Parser)的源代码。它基于LL(k)解析算法,并且支持自定义文法,使得开发者能够构建复杂的语法分析器,用于...

    javacc-5.0.zipjavacc-5.0.zip

    JavaCC(Java Compiler Compiler)是一款强大的词法分析和语法分析工具,主要用于生成Java语言的解析器和词法分析器。这个“javacc-5.0.zip”文件包含了JavaCC的5.0版本,是一个用于处理源代码和其他形式的文本输入...

    JavaCC教程(附源码)

    ##### 2.1 JavaCC的入门示例 为了更好地理解JavaCC的工作原理,我们将通过一个简单的例子来进行演示:实现一个可以计算整数加法的解析器。我们的目标是处理如下格式的表达式: ```plaintext 99+42+0+15 ``` 其中...

    JavaCC学习心得

    JavaCC 学习心得 JavaCC 是一种强大的解析器生成器,可以根据用户的需求生成解释器。下面是对 JavaCC 的学习心得,分为工作原理、使用方法和深层认识三个方面。 工作原理: 1.1 结构综述: JavaCC 文件可以分为...

    javaCC5.0压缩包

    JavaCC(Java Compiler Compiler)是一款强大的词法分析和语法分析工具,主要用于生成解析器和词法分析器。它能够解析符合特定语法的输入,并将其转换为抽象语法树(AST),进而便于程序处理。JavaCC 5.0是该工具的...

    javacc安装包javacompilercompiler

    JavaCC(Java Compiler Compiler)是一款强大的词法分析和语法分析工具,主要用于生成解析器和词法分析器。它是Java语言的版本,适用于构建基于Java的解析器,如编译器、解释器或查询处理器。JavaCC的核心是它能将一...

    Javacc常用问题解答

    ### JavaCC 常见问题解答 #### 一、JavaCC 概览 **1.1 最近 FAQ 的更改** 本 FAQ 的更新主要是为了更好地适应 JavaCC 的最新版本,并对用户提出的一些常见问题进行了解答。 **1.2 什么是 JavaCC?** JavaCC 是...

    javacc简介

    快速的javacc入门!解决开发时间。是开发编译器比较好的入门讲解。

    javacc+jjtree使用教程

    JavaCC和JJTree是用于构建解析器和抽象语法树(AST)的工具,常用于编译器设计和解析复杂语法的场景。它们是Java语言的版本,类似于其他编程语言中的YACC和LEX。 1. **JavaCC**: - JavaCC(Java Compiler ...

    javacc学习手册(个人总结)

    javacc学习手册 javacc是一款功能强大的编译器生成工具,可以生成词法分析器和语法分析器。下面是javacc的详细知识点: javacc安装 1. 安装JDK,并设置环境变量PATH路径。 2. 下载javacc,例如下载4.0版本的zip包...

    JavaCC实现MiniC语言的编译

    JavaCC是Java语言的一个工具,用于生成解析器和词法分析器,主要用于处理复杂的语法结构。在本项目中,"JavaCC实现MiniC语言的编译"是一个实践性的任务,目的是利用JavaCC来构建一个小型的C语言编译器——MiniC。这...

Global site tag (gtag.js) - Google Analytics