トップページドキュメント > Xcodeでの構文色付け定義

文法の定義

これまでに、キーワードなどの字句に対して色付けする方法を紹介しました。実際のところこれだけで構文色付けのほとんどの要求は満たされると思いますが、.xclangspecには、これに加えて字句を組み合わせた文法に対しても色付けなどを設定することができます。

文法の定義は、以下のようにTokenizerキーとRulesキーを組み合わせて行います。

{
    Identifier = "my.lang.sample.greeting.identifier";
    Syntax = {
        StartChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Chars = "abcdefghijklmnopqrstuvwxyz";
        Words = ( "How", "Are", "You" );
        AltType = "xcode.syntax.identifier";
    };
},

{
    Identifier = "my.lang.sample.greeting.lexer";
    Syntax = {
        IncludeRules = ( "my.lang.sample.greeting.identifier" );
    };
},

{
    Identifier = "my.lang.sample.greeting";
    Syntax = {
        Tokenizer = "my.lang.sample.parse.lexer";
        Rules = ( "How", "Are", "You", "." );
        Type = "xcode.syntax.keyword";
    };
}

Tokenizerで文法解析に使用する字句を定義し、Rulesで字句の並べ方を記述して文法を定義します。

今回のRulesでは、"How", "Are", "You", "."となっているため、これらの字句がこの順番で並んだときに、この構文にマッチします。なお、単語と単語の間には、任意の空白文字を入れることができます。

"How", "Are", "You"などの単語は、Tokenizerの中でWordsとして定義されていなければなりません。ただし、"."などの記号文字は、特に定義されていなくても使えるようです。

つぎに、Rulesでは、正規表現の?+*|が使えます。それぞれ単語の末尾に付加して使います。

{
    Identifier = "my.lang.sample.greeting";
    Syntax = {
        Tokenizer = "my.lang.sample.parse.lexer";
        Rules = ( "How?", "Are+", "You*", ".|," );
        Type = "xcode.syntax.keyword";
    };
}

このようにすると、"How"はあっても無くても良い。"Are"は1回以上繰り返す。"You"は0回以上繰り返す。最後は"."または","のどれか。という文法定義になります。

それから、今まで"How"などの単語を書いていた箇所には、単語の代わりに構文の識別子を書くこともできます。構文識別子には、字句定義だけでなく文法定義の識別子も書けるので、文法定義と文法定義を組み合わせて、より複雑な文法を定義することもできます。

{
    Identifier = "my.lang.sample.greeting";
    Syntax = {
        Tokenizer = "my.lang.sample.parse.lexer";
        Rules = (
            "How",
            "my.lang.sample.identifier",
            "xcode.lang.string",
            "."
        );
        Type = "xcode.syntax.keyword";
    };
}

上記の例では、"How"のあとに、任意の識別子、任意の文字列を続けることができます。

ただし、"my.lang.sample.identifier"は、Wordsで定義した単語にはマッチしません。Wordsで定義した単語も含めてマッチさせたいなら、正規表現の|を使って以下のように定義しなければなりません。

{
    Identifier = "my.lang.sample.greeting";
    Syntax = {
        Tokenizer = "my.lang.sample.parse.lexer";
        Rules = (
            "How",
            "my.lang.sample.identifier|How|Are|You",
            "xcode.lang.string",
            "."
        );
        Type = "xcode.syntax.keyword";
    };
}
Copyright(C)2001-2010 STRIPE-NET. All Right Reserved.