编译器一日一练(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来构建自己的编译器还是非常不错的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值