【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
过去编写编译器可以用lex和bison,其实用javacc也是不错的选择。如果使用javacc,token和语法都是放在一个文件里面的。通过javacc解析jj文件,就可以生成对应的java代码。把这些java代码编译好,就是最后我们需要的工具。
代码连接:https://github.com/feixiaoxing/DIYCompiler
1、下载javacc工具
主要就是一个jar文件,这里使用的是javacc-7.0.10.jar。
2、准备jj文件,即Adder.jj
options {
STATIC = false;
}
PARSER_BEGIN(Adder)
import java.io.*;
public class Adder {
public static void main(String[] args) {
for (String arg : args) {
try {
System.out.println(evaluate(arg));
} catch (ParseException ex) {
System.err.println(ex.getMessage());
}
}
}
public static long evaluate(String src) throws ParseException {
Reader reader = new StringReader(src);
return new Adder(reader).expr();
}
}
PARSER_END(Adder)
SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {
<INTEGER: (["0"-"9"])+>
}
long expr() throws NumberFormatException :
{
Token a ;
Token b ;
int value = 0 ;
}
{
a = <INTEGER> "+" b = <INTEGER>
{
value = Integer.parseInt( a.image ) + Integer.parseInt(b.image);
}
<EOF>
{ return value ; }
}
整个jj文件主要有四个部分。第一个部分是options,这里表示支持的各种选项。第二个部分是java代码,位于PARSER_BEGIN()和PARSER_END()之间。第三部分是词法分析,即SKIP、TOKEN这部分内容。第四部分是语法部分,代码比较简单,即expr这个部分。
3、编译jj文件
java -classpath C:\Users\feixiaoxing\Desktop\test\javacc-7.0.10.jar javacc Adder.jj
不出意外的话,会生成一堆的java文件,有兴趣可以看看。其实暂时不看问题也不大。
4、编译java文件
C:\Progra~2\Java\jdk1.8.0_91\bin\javac *.java
这里的java是指生成的所有java文件。当然我们最关心的还是是否可以生成Adder.class这个文件,毕竟它是我们最终运行的文件。
5、执行Adder程序
C:\Users\feixiaoxing\Desktop\test>java Adder 8+9
17
执行相对来说是比较简单的。后面8+9当作字符串传递给evalute函数。evalute函数进一步调用expr函数,也就是所有语法的入口,这就形成了一个完整的处理逻辑了。整体来说,用javacc来构建自己的编译器还是非常不错的。