编译器一日一练(DIY系列之加法器)
Posted 嵌入式-老费
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器一日一练(DIY系列之加法器)相关的知识,希望对你有一定的参考价值。
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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来构建自己的编译器还是非常不错的。
以上是关于编译器一日一练(DIY系列之加法器)的主要内容,如果未能解决你的问题,请参考以下文章