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");
のようにサイズを合わせて書く必要があります。
コンパイル問題
-lantlr3c -stdlib=libc++
オプションを付けないと落ちました。
これから
ANTLRの厄介な文法に悩まされていますが、
少しずつ理解できるようになりました。
boost::spiritが使える方はそっちを使うのが良いと思われますが、
言語開発をストレスなく行うことでは boost::spirit より良いと思いました。