`
duyangsss
  • 浏览: 127452 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JAVACC 入门(转载)

阅读更多
 

    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如果仍然成立,且逻辑表达式也成立,则执行下面的展开。

 

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

分享到:
评论

相关推荐

    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 eclipse_1.5.24.zip javacc插件

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

    javacc语法分析.zip

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

    JavaCC教程(附源码)

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

    javacc-5.0.zipjavacc-5.0.zip

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

    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