JavaCC的使用

一、JavaCC

JavaCC(Java Compiler Compiler)是一个词法分析生成器语法分析生成器

词法分析器可以把文本按照事先规定好的格式分割成一个个单词符号(Token)。这些Token序列将会传送给语法分析器以供其决定程序的结构。

二、栗子

1.语法描述文件

adder.jj

/* options部分*/
options {
    STATIC = false; //生成非静态类
    DEBUG_PARSER = false;
    OUTPUT_DIRECTORY = "/home/zxm/IdeaProjects/java-test/java-haha/src/main/java/com/example/javacc/parser";
}

/* 分析器类的声明 */
PARSER_BEGIN(Adder)

package com.example.javacc.parser;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class Adder {
    public static void main(String[] args) throws ParseException, TokenMgrError {
        InputStream is = new ByteArrayInputStream("11.22 + 2 + 4".getBytes());
        Adder parser = new Adder(is);
        double result = parser.evaluate();
        System.out.println(result);
    }
}

PARSER_END(Adder)

/* 词法分析器 */
SKIP : { " " }
SKIP : { "\n" | "\r" | "\r\n" }
TOKEN : { < PLUS : "+" > }
TOKEN : { < NUMBER : <DIGITS> | <DIGITS> "." <DIGITS> > }
TOKEN : { < #DIGITS : (["0"-"9"])+ > }

/* 语法分析器 */
double evaluate() throws NumberFormatException :
{
    double i;
    double value;
}
{
    value = primary()
    (
        <PLUS>
        i = primary()
        {value += i;}
    )*
    <EOF>
    {return value;}
}

double primary() :
{
    Token t;
}
{
    t = <NUMBER>
    {return Double.parseDouble(t.image);}
}

2.使用javacc命令,生成java文件

javacc adder.jj

执行命令:

生成java类:

三、测试

1.测试词法分析

    @Test
    public void testToken() {
        InputStream is = new ByteArrayInputStream("11.2 + 2.3 + 4".getBytes());
        SimpleCharStream scs = new SimpleCharStream(is);
        AdderTokenManager tokenManager = new AdderTokenManager(scs);
        Token token;
        while (true) {
            token = tokenManager.getNextToken();
            if (token == null || token.kind == AdderConstants.EOF)
                break;
            System.out.println(token.image);
        }
    }

结果:

2.测试语法分析

    @Test
    public void testParser() throws ParseException {
        InputStream is = new ByteArrayInputStream("11.22 + 2 + 4".getBytes());
        Adder parser = new Adder(is);
        double result = parser.evaluate();
        System.out.println(result);
    }

结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章