2016-08-25 29 views
0

私は単純な後置プログラミング言語を作成しています。構文は次のとおりです。 2 3 addは、2つの整数23を一緒に追加します。 "hello, world!" putsは、文字列"hello, world!"をSTDOUTに設定します。次のようにtmLanguageシンタックスの強調表示をしないでbeginを強調表示せずにbeginを終了します。

使用できる新しい機能の定義は、行われます。

"fourth_pow" 
    "This function raises the argument on the top of the stack to the fourth power." 
    [ 
    dup dup dup mul mul mul 
    ] 
def 

空白や改行は言語の文法では重要ではありません。これは、上記の定義が"fourth_pow" "..." [ dup dup dup mul mul mul] defとして作成されている可能性があることを意味します(もちろん、これは読みにくい)。

この言語の構文を強調して、上記の定義ステートメントで新しく定義された関数名とdefキーワードが強調表示されるようにします。

(YAMLフォーマットで).tmLanguageファイルからの抜粋です:

definition: 
    name: "entity.other.function.jux-beta_syntax" 
    begin: ("([a-zA-Z_][\w]*[?!]?)") 
    end: (def) 
    beginCaptures: 
     '1': {name: "entity.name.function.jux-beta_syntax"} 
    contentName: "support.constant.jux-beta_syntax" 
    patterns: 
    - include: '#comment' 
    - include: '#quotation_start' 
    - include: '#quotation_end' 
    - include: '#string' 
    - include: '#identifier' 
    - include: '#integer' 

(ファイル全体hereを参照してください)

この「作品」が、それはそのときの終わりを意味しファイル、私は新しい文字列を開始し、それは関数定義であるかのように強調表示されます。これは、#definitionルールの 'begin'部分が一致するためです。しかし、私が何をしたいのかは、試合が終わると色付けすることだけです。

tmLanguage形式を使用する方法はありますか?

答えて

1

主な問題は、少なくともSublime Text(TextMateまたはVSCodeをテストしていない)では、正規表現エンジンは.tmLanguageファイルを使用して一度に1行しか一致させることができないということです。したがって、このような何か:

(?m:("([a-zA-Z_][\w]*[?!]?)")(.*)(def)) 

それはRubyでうまく動作しますが、?m:複数行オプション(.マッチの改行)動作しませんを使用して、(正規表現エンジンは鬼車に基づいています)。構文の強調表示は一度に1行しか表示されないため、二重引用符で囲まれた文字列が入力されるとすぐにbeginCapturesが一致します。もちろん、関数の本体とdefが書き込まれると、すべてが適切にハイライト表示されます。

残念ながら、私はあなたに関連する実例を与えるのに十分なほどではありませんが、Sublime Text 3の最新バージョンの新しいsublime-syntaxフォーマットをチェックしてみてください。これはスタックを使って機能するので、コンテキストを押したりポップしたりすることができ、複数行のマッチングが可能です。 [選択された例]セクションでは、例としてブラケットバランスを見てください。閉じ括弧)がハイライト表示されます。一致する括弧はなし(です。

幸運を祈る!