一、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);
}
结果: