Create a new repository

全力で行くらしい

ANTLRで言語開発

前回、計算機作った時にゴミと言ってた ANTLRが、
普通に利用できたので、利用して言語を作る事になりました。

幾つか、注意しざるを得ないことがあったので、
それをまとめて書いておきます。

_empty問題

@lexer::header{
   #define _empty NULL
}

を書かないと高確率で落ちます。

文字コード問題

文字コードと確保するサイズを合わせないと、

lang(1) : lexer error 3 :
    1:1: Tokens : ( LIST | ARG | ARGS ); at offset 11, near char(00) :

のようなエラーをはきます。 回避するには、

ANTLR3_UINT32 size = static_cast<ANTLR3_UINT32>(inputStr.size()); // UTF16なら inputStr.size() * 2
pANTLR3_INPUT_STREAM stream = antlr3StringStreamNew(
                                      input_string,
                                      ANTLR3_ENC_UTF8,  // UTF16なら変更
                                      size,
                                      (pANTLR3_UINT8)"hoge");

のようにサイズを合わせて書く必要があります。

コンパイル問題

OSXのclang++でコンパイルする際に、

-lantlr3c -stdlib=libc++

オプションを付けないと落ちました。

これから

ANTLRの厄介な文法に悩まされていますが、
少しずつ理解できるようになりました。
boost::spiritが使える方はそっちを使うのが良いと思われますが、
言語開発をストレスなく行うことでは boost::spirit より良いと思いました。