マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

足し算

『普通のコンパイラをつくろう』を読みながらJavaCCで遊んでいる。本に載っているAdderをいじって、16進数も読み取れるようにしてみた。ついでに-符号もつけられるようにした。面白いな、これ。

options{
    STATIC = false;
    UNICODE_INPUT = true;
}

PARSER_BEGIN(Compiler)
import java.io.Reader;
import java.io.StringReader;

public class Compiler{
    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 Compiler(reader).expr();
    }
}
PARSER_END(Compiler)

SKIP: {<[" ", "\t", "\r", "\n"]>}

TOKEN: {
    <INTEGER: ("-")? (["0"-"9"])+
            | ("-")? "0x" (["0" - "9", "a" - "f", "A" - "F"])+>
}

long expr():
{
    Token x, y;
}
{
    x = <INTEGER> "+" y = <INTEGER> <EOF>
        {
            long xvalue = 0;
            long yvalue = 0;

            if(x.image.startsWith("0x")){
                xvalue = Long.parseLong(x.image.substring(2), 16);
            }else{
                xvalue = Long.parseLong(x.image);
            }

            if(y.image.startsWith("0x")){
                yvalue = Long.parseLong(y.image.substring(2), 16);
            }else{
                yvalue = Long.parseLong(y.image);
            }

            return xvalue + yvalue;
        }
}