『普通のコンパイラをつくろう』を読みながら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; } }