私は、 LPEG を使用して構文強調表示のサポートを実装するテキスト エディターに取り組んできました。起動して実行するのは非常に簡単でしたが、必要最小限の作業しか行いませんでした。
次のような一連のパターンを定義しました。
-- Keywords
local keyword = C(
P"auto" +
P"break" +
P"case" +
P"char" +
P"int"
-- more ..
) / function() add_syntax( RED, ... )
これは入力を正しく処理しますが、残念ながら一致が多すぎます。たとえば、文字どおりの一致に " " を使用しているためint
、 の途中で一致するprintf
ことが予想されます。P
明らかに「適切な」強調表示を実行するには、「int」は「int」と一致しますが、「printf」、「vsprintf」などとは一致しないように、単語の境界で一致する必要があります。
これを使用して、一致が " <[{ \n
" の後にのみ発生するように制限しようとしましたが、これは私が望むことをしませんでした:
-- space, newline, comma, brackets followed by the keyword
S(" \n(<{,")^1 * P"auto" +
Cコードで期待される空白またはその他の文字で囲まれたキーワード/トークンのみに一致する、ここに欠けている単純で明白な解決策はありますか? 強調表示できるようにキャプチャされたトークンが必要ですが、それ以外の場合は、特定のアプローチと結婚していません。
例: これらは一致する必要があります:
int foo;
void(int argc,std::list<int,int> ) { .. };
しかし、これはすべきではありません:
fprintf(stderr, "blah. patterns are hard\n");