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