编译器一日一练(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系列之加法器)的主要内容,如果未能解决你的问题,请参考以下文章

编译器一日一练(DIY系列之连续加减法)

编译器一日一练(DIY系列之连续加减法)

编译器一日一练(DIY系列之四则运算)

编译器一日一练(DIY系列之四则运算)

编译器一日一练(DIY系列之复杂语法树)

编译器一日一练(DIY系列之复杂语法树)