zoukankan      html  css  js  c++  java
  • [导入]JavaCC学习笔记 by greatdino

      JavaCC是一个java语言分析器,就是按照“模版”,“装配”不同的语言分析程序的源代码。复杂语言的语法通常都是使用 BNF(巴科斯-诺尔范式,Backus-Naur Form)表示法或者其“近亲”― EBNF(扩展的 BNF)描述的。自动化工具可以使用那些描述(我将使用通用的术语 BNF来指代这两种变体)或与它们近似的描述来为你生成解析代码。

    这个例子可以在javacc-4.0/doc/examples/SimpleExamples/Simple1.jj看到 

    ......

    PARSER_BEGIN(Simple1)
    public class Simple1 {
    public static void main(String args[]) throws ParseException {
      Simple1 parser = new Simple1(System.in);
      parser.Input();
    }
    }

    PARSER_END(Simple1) void Input() : {} {
      MatchedBraces() ("\n"|"\r")*
    }
    void MatchedBraces() : {} {
      "{" [ MatchedBraces() ] "}" }

    ......

    设置好javacc的bin目录后,在命令提示符下输入

    javacc Simple1.jj

    然后javacc就会为你生成下面几个java源代码文件

    Simple1.java
    Simple1TokenManager.java
    Simple1Constants.java
    SimpleCharStream.java
    Token.java
    TokenMgrError.java

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

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

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

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

    PARSER_BEGIN(classname)

    Class classname {

           ……

    }

    PARSER_END(classname)

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

    SKIP {
           “ “
    |
           “\n”
    |
           “\r”
    }

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

    TOKEN {
           <ID: (“a”-“z”|”A”-“Z”)+>
    |
           <NUM: (“0”-“9”)+>
    }

           这个部分是可以省略的。

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

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

    Return_type function_name()
    {变量声明和一些初始化的动作}
    {上下文无关文法的右部分,其中每个组成部分的形式如下:
      语法部分 {动作部分}
      两个部分都可以省略。语法部分可以是一个字符串(简单的token常常可以这样处理),TOKEN中声明的token,或一个对某个非终结符对应的函数的调用。
    }

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

    []:其中的内容是可选的。
    +:前面的内容出现一次或多次。
    -:前后构成的闭区间。
    *: 前面的内容出现0次或多次。
    ?:前面的内容出现0次或一次。
    ~:后面的内容的补。
    |:前面或后面。
    ():改变运算的优先级,把其中的内容作为一个整体。

     


    文章来源:http://www.w3cool.com/2007/05/03/javacc.html
  • 相关阅读:
    win中使用curl上传文件报错
    S2-052
    S2-048
    S2-045、S2-046
    S2-033、S2-037
    S2-032
    S2-029
    day12-python之深灰魔法
    day10-11-python基础之字符串
    day09-python基础
  • 原文地址:https://www.cnblogs.com/weijie/p/1348751.html
Copyright © 2011-2022 走看看