5

シンタックスハイライトで使用される一般的なアルゴリズムは何ですか?正規表現で交互を使用する簡単なアプローチを実装しました。

STRING_PATTERN | COMMENT_PATTERN | KEYWORD_PATTERNS

何かが文字列であるかパターンであるかを検出するのは、どちらが先に来るかによって異なります。

// This is a "comment"

"This is a // string"

ただし、キーワードを使用すると少し複雑になります。このアプローチは私の現在の実装では機能していますが、それが最適であるとは確信していません。

もう1つの問題は、強調表示する順序です。識別子/キーワードの前に数字を強調表示すると、キーワード内の数字を誤って強調表示する可能性があります...

編集:

私のプラグインはここにあります:http ://wordpress.org/extend/plugins/crayon-syntax-highlighter/

4

1 に答える 1

9

構文の強調表示がコンテキストを理解するのに役立たないため、正規表現でこれを行うのに苦労するかもしれません。つまり、正規表現は、より大きな可能な一致の一部であるかどうかに関係なく、どこにでも現れるものと一致します。

Antlr などのパーサー ジェネレーターを調査する必要があります。これらのパーサー ジェネレーターは、有効で明確な文法があれば、これらの詳細を考慮したトークンを提供できます。たとえば、コメントが EOL まで "//" として定義されている場合、コメント トークンが返されます。これは、任意の文字列文字または内部のものに取って代わります。

このようなパーサーの標準的なアプローチは、文字 (より具体的にはトークン) のストリームを一度に 1 つずつ読み取ることです。したがって、強調表示は、定義したルールの順序ではなく、ストリーム内での出現順序に依存します。

たとえば、文字列は 2 つの二重引用符とその間のすべて (別の二重引用符を除く) である可能性があります。コメントは 2 つのスラッシュと行末までのすべてです。

解析時に二重引用符が見つかった場合、プログラムは「文字列だと思います」モードになり、一致する終了引用符が見つかると、文字列トークンを確認して強調表示のために返します。同様に、2 つのスラッシュが見つかった場合は、行末 (または実際にはファイルの終わり) が見つかるまで検索し、それを強調表示のトークンとして返します。

1 行コメントや複数行コメントなど、一致するルールが複数ある場合は、さらに複雑になります。単一のスラッシュ文字を取得する場合、プログラムはそれらのオプションの一部を拒否する前に別の文字を読み取る必要があります。つまり、2 番目のスラッシュまたは * を取得するまで、それがどのような種類のトークンに含まれているかわかりません。

基本的に、すべてはステート マシンに帰着します。独自のものを構築してみるか、Antlr のようなものを入手して文法を入力し、すべての作業を任せることができます。

于 2011-07-19T04:52:39.327 に答える