• javacc之路0--- 安装与使用


    官网:
    https://javacc.github.io/javacc/
    https://github.com/javacc/javacc#getting-started

    语法

    Usage:
        javacc option-settings inputfile
    
    "option-settings" is a sequence of settings separated by spaces.
    Each option setting must be of one of the following forms:
    
        -optionname=value (e.g., -STATIC=false)
        -optionname:value (e.g., -STATIC:false)
        -optionname       (equivalent to -optionname=true.  e.g., -STATIC)
        -NOoptionname     (equivalent to -optionname=false. e.g., -NOSTATIC)
    
    Option settings are not case-sensitive, so one can say "-nOsTaTiC" instead
    of "-NOSTATIC".  Option values must be appropriate for the corresponding
    option, and must be either an integer, a boolean, or a string value.
    
    The integer valued options are:
    
        LOOKAHEAD              (default 1)
        CHOICE_AMBIGUITY_CHECK (default 2)
        OTHER_AMBIGUITY_CHECK  (default 1)
    
    The boolean valued options are:
    
        STATIC                 (default true)
        SUPPORT_CLASS_VISIBILITY_PUBLIC (default true)
        DEBUG_PARSER           (default false)
        DEBUG_LOOKAHEAD        (default false)
        DEBUG_TOKEN_MANAGER    (default false)
        ERROR_REPORTING        (default true)
        JAVA_UNICODE_ESCAPE    (default false)
        UNICODE_INPUT          (default false)
        IGNORE_CASE            (default false)
        COMMON_TOKEN_ACTION    (default false)
        USER_TOKEN_MANAGER     (default false)
        USER_CHAR_STREAM       (default false)
        BUILD_PARSER           (default true)
        BUILD_TOKEN_MANAGER    (default true)
        TOKEN_MANAGER_USES_PARSER (default false)
        SANITY_CHECK           (default true)
        FORCE_LA_CHECK         (default false)
        CACHE_TOKENS           (default false)
        KEEP_LINE_COLUMN       (default true)
    
    The string valued options are:
    
        OUTPUT_DIRECTORY       (default Current Directory)
        TOKEN_EXTENDS          (java.lang.Object)
        TOKEN_FACTORY          (java.lang.Object)
        JDK_VERSION            (1.5)
        GRAMMAR_ENCODING       (default file.encoding)
    
    EXAMPLE:
        javacc -STATIC=false -LOOKAHEAD:2 -debug_parser mygrammar.jj
    
    ABOUT JavaCC:
    
        JavaCC is a parser generator for the Java programming language.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    安装

    下载解压
    在这里插入图片描述
    执行:

    mvn package

    将 javacc-7.0.10.jar 重命名为 javacc.jar
    并将目录下的scripts文件夹加入到环境变量中。
    执行javacc命令验证是否成功。

    测试

    官网例子,解析大括号
    合法:
    {}, }}} // … etc
    非法:
    {}{}, }{}}, { }, {x} // … etc
    新建文件 Parser.jj:

    PARSER_BEGIN(Example)
    
    /** Simple brace matcher. */
    public class Example {
    
      /** Main entry point. */
      public static void main(String args[]) throws ParseException {
        Example parser = new Example(System.in);
        parser.Input();
      }
    
    }
    
    PARSER_END(Example)
    
    /** Root production. */
    void Input() :
    {}
    {
      MatchedBraces() ("\n"|"\r")* 
    }
    
    /** Brace matching production. */
    void MatchedBraces() :
    {}
    {
      "{" [ MatchedBraces() ] "}"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    执行命令:
    在这里插入图片描述
    在这里插入图片描述

    javac Example.java
    java Example
    在这里插入图片描述

    基本概念

    生成扫描器的程序称为扫描器生成器(scanner generator),生成解析器的程序称为解析器生成器(parser generator)。只需指定需要解析的语法,扫描器生成器和解析器生成器就能生成解析相应语法的代码。

    扫描器生成器都大体类似,解析器生成器则有若干个种类。现在具有代表性的解析器生成器可分为LL解析器生成器和LALR解析器生成器两类。

    1.词法分析
    在编程语言处理系统中,我们将“一个单词(的字面)”和“它的种类”“语义值”统称为token。通过使用token这个词,词法分析器的作用就可以说是解析代码(字符行)并生成token序列。

    词法分析(lexical analyze)就是将代码分割为一个个的单词,也可以称为扫描(scan)。举例来说,词法分析就是将x = 1 + 2这样的程序分割为“x”“=”“1”“+”“2”这样5个单词。并且在该过程中,会将空白符和注释这种对程序没有实际意义的部分剔除。正因为预先有了词法分析,语法分析器才可以只处理有意义的单词,进而实现简化处理。

    负责词法分析的模块称为词法分析器(lexical analyzer),又称扫描器(scanner)。

    JavaCC采用正则表达式(regular express)的语法来描述需要解析的单词的规则,并由此来表现扫描器。
    在这里插入图片描述

    2.语法分析

    语法描述文件

    语法规则通常会用一个扩展名为“.jj”的文件来描述,该文件称为语法描述文件。

    options {
        JavaCC的选项
    }
    
    PARSER_BEGIN(解析器类名)
    package包名;
    import库名;
    public class解析器类名 {
        任意的Java代码
    }
    PARSER_END(解析器类名)
    扫描器的描述
    解析器的描述
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    语法描述文件的开头是描述JavaCC选项的options块,这部分可以省略。
    JavaCC和Java一样将解析器的内容定义在单个类中,因此会在PARSER_BEGIN和PARSER_END之间描述这个类的相关内容。
    这部分可以描述package声明、import声明以及任意的方法。

    PARSER_BEGIN(Adder)到PARSER_END(Adder)是解析器类的定义。

    SKIP和TOKEN部分定义了扫描器。SKIP表示要跳过空格、制表符(tab)和换行符。TOKEN表示扫描整数字符并生成token。

    例:

    options {
        STATIC = false;
    }
    
    
    PARSER_BEGIN(Adder)
    import java.io.*;
    
    
    class Adder {
        static public void main(String[] args){
            for(String arg : args){
                try {
                    System.out.println(evaluate(arg));
                }
                catch(ParseException ex){
                    System.err.println(ex.getMessage( ));
                }
            }
        }
    
    
        static public long evaluate(String src)throws ParseException {
            Reader reader = new StringReader(src);
            return new Adder(reader).expr( );
        }
    }
    PARSER_END(Adder)
    
    
    SKIP: { <[" ", "\t", "\r", "\n"]> }
    
    
    TOKEN: {
        
    }
    
    
    long expr( ):
    {
        Token x, y;
    }
    {
        x= "+" y= 
            {
                return Long.parseLong(x.image)+ Long.parseLong(y.image);
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这里插入图片描述

  • 相关阅读:
    【C++】linux下的gdb程序调试
    rust多个mod文件引用和文件夹mod使用注意事项
    webservice初探
    【Linux】操作系统以及虚拟机的安装与配置
    牛客出bug(华为机试HJ71)
    【Docker】容器化应用程序的配置管理策略与实践
    NMap 使用技巧总结(二)
    Ngrok实现内网穿透
    为什么低代码CRM越来越受欢迎?
    【Vue】单项数据流的理解
  • 原文地址:https://blog.csdn.net/u013257767/article/details/128050462