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

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

日本語プログラミングしてみたい

どうせだから日本語プログラミングしてみたいと思い、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));
        }
}

読み込むファイルの内容

"ハローワールド"を表示する