どうせだから日本語プログラミングしてみたいと思い、JavaCCで試した見た。JavaCCのソースコード内でUnicodeを扱うには下記のコードを入れればいいらしい(ふつうのコンパイラをつくろうより)。
options{ STATIC = false; UNICODE_INPUT = true; JDK_VERSION = "1.5"; }
あとはIDENTIFIERに日本語にマッチする正規表現を書く。大体の日本語文字にヒットする正規表現に書いてある通りにやったら"ー"がヒットしなかったので"ー"も加えておいた。あとは、読みこむファイルの文字コードに気を付けるのみ。
options{ STATIC = false; UNICODE_INPUT = true; JDK_VERSION = "1.5"; } PARSER_BEGIN(Compiler) import java.io.Reader; import java.io.StringReader; import java.io.InputStreamReader; import java.io.FileInputStream; import java.io.BufferedReader; import java.io.IOException; import java.util.List; import java.util.ArrayList; public class Compiler{ public static void main(String[] args){ for(String arg : args){ try{ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(arg), "UTF-8")); StringBuilder text = new StringBuilder(); String line; while((line = br.readLine()) != null){ text.append(line).append('\n'); } br.close(); evaluate(text.toString()); }catch(ParseException ex){ System.err.println(ex.getMessage()); }catch(IOException exception){ exception.printStackTrace(); } } } public static void evaluate(String src) throws ParseException{ Reader reader = new StringReader(src); new Compiler(reader).file(); } } PARSER_END(Compiler) SKIP: {<[" ", "\t", "\r", "\n"]>} SKIP: { <LINE_COMMENT: "//" (~["\n", "\r"])* ("\n" | "\r\n" | "\r")?> } TOKEN: { <DISPLAY: "を表示する"> } TOKEN: { <IDENTIFIER: ["a"-"z", "A"-"Z", "_", "ぁ"-"ヶ", "亜"-"鄢", "ー"](["a"-"z", "A"-"Z", "_", "0"-"9", "ぁ"-"ヶ", "亜"-"鄢", "ー"])*> } MORE: { <"/*">: IN_BLOCK_COMMENT } <IN_BLOCK_COMMENT> MORE: { <~[]> } <IN_BLOCK_COMMENT> SPECIAL_TOKEN: { <BLOCK_COMMENT: "*/"> : DEFAULT } MORE: { <"\""> : IN_STRING } <IN_STRING> MORE: { <(~["\"", "\\", "\n", "\r"])+> | <"\\" (["0"-"7"]){3}> | <"\\" ~[]> } <IN_STRING> TOKEN: { <STRING: "\""> : DEFAULT} MORE: { <"'"> : IN_CHARACTER } <IN_CHARACTER> MORE: { <(~["'", "\\", "\n", "\r"])+> : CHARACTER_TERM | <"\\" (["0"-"7"]){3}> : CHARACTER_TERM | <"\\" ~[]> : CHARACTER_TERM } <CHARACTER_TERM> TOKEN: { <CHARACTER: "'"> : DEFAULT} void file():{} { (expr())* <EOF> } void expr(): { Token x; } { x = <STRING> <DISPLAY> { String text = x.image; System.out.println(text.substring(1, text.length() - 1)); } }
読み込むファイルの内容
"ハローワールド"を表示する
ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み
- 作者: 青木峰郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2009/07/24
- メディア: 単行本
- 購入: 25人 クリック: 398回
- この商品を含むブログ (48件) を見る