1

これを編集してVimで編集している間、私はその構文強調表示(いくつかのファイルタイプ)にいくつかの欠陥があることがよくあります。私は現時点では事例を覚えていないが、確かに誰かがそうするだろう。通常、いくつかのケースではひどくハイライトされた文字列と、算術演算子とブール演算子といくつかの小さなものから構成されています。正規表現の代わりに構文ハイライトを使用するにはどうすればよいですか?

これで、vimはそのちょっとしたもの(独自のフレーバー)に正規表現を使用します。

しかし、私は一見したところで、より強調された構文を強調しているエディタに出会いました。私はいつも正規表現はそのようなもののために行く方法だと思ってきました。

私は、これらの編集者は正規表現を書いたほうがよいのでしょうか、それとも他の方法でそれを処理するのでしょうか?何 ?構文の強調表示は、それを「安定」にしたいときにどう扱われますか? あなたの意見では、編集者の中で最も気をつけた編集者は何ですか?そして、彼はどのようにそれを(言語的に)しましたか?

編集-1:たとえば、Emacs、Notepad2、Notepad ++、Visual Studioなどのエディタは、synのためにどのような仕組みが使用されているか知っていますか?高い。 ?

答えて

4

構文の強調表示のために正規表現の代わりに使用したいことがすぐに思い浮かぶのは、の構文解析です。正規表現には多くの利点がありますが、vimの強調表示に見られるように、制限があります。 (正規表現を使ってXMLを解析する方法についてのスレッドを探すならば、正規表現がパーサーが何をすることができないのかという広範囲な資料があります)。

文法の強調から、構文構造正規表現が近似できる言語のうち、正規表現ができることを超えて、あるレベルの真の解析を実行する必要があります。単純な再帰的な降下レクサーはおそらくほとんどの言語ですばらしいことですが、私は考えています。

1

構文の強調表示にREを使用することをお勧めします。それが正しく動作しない場合、あなたのREは強力で複雑ではありません:-)これは、REが輝くそれらの領域の1つです。

しかし、あなたが失敗の例を提供することはできません(問題の内容を伝えることができるように)か、それをより良く行うエディタの名前を提供することができます私たちはあなたに答えを与えることができるでしょう。

私は主流の言語でVimに何の問題も経験したことはありません。私は奇妙な難解な言語を使用する必要がなかったので、私の目的にはうまくいきます。

+0

@Paxを使用すると、構文ハイライトには完全に壊れたパーサーでREを使用しますか?私はこれがあなたがパーサを使いたいと思うケースの1つであると考えていました。 – mmcdole

+0

パーサーは優れていますが、一般的にはソースをより多く処理しなければならず、書き込むのがより複雑です。ソースが自然なチェックポイント(例えば、引用符で囲まれていないと仮定すると、Cの場合はセミコロン)を持つ傾向があるため、RE(実行が正しく行われている場合)は高速かつ大多数の状況で動作します。これは私の経験で色分けされていることを覚えておいてください - 私はVimにForthコードを書く必要はありませんでした。私が知っている限り、REはそれを気にするかもしれません。私が使用している言語はうまく動作しているようですが、私のソースコードを醜く見せてしまうと、おそらくそれを破ることができます。 – paxdiablo

2

ハイライト表示を正確にするには、正規表現ではなく実際のプログラミングが必要です。 RegExsはまれな仕事ではありません。より良い方法で強調表示を行うには、単純なパーサを書く必要があります。構文解析には、基本的には別々のコンポーネントがあります。各コンポーネントは、引用符で囲まれた文字列または数値リテラルを識別して使用するようなことができます。上記のコンポーネントがカーソルを見ているときに、そのコンポーネントが下にあるものを消費できない場合、何もしません。これにより、簡単に解析したり、簡単にハイライトしたりすることができます。

静的intフィールド= 123;

•最初のmacherは、 "静的"の前に空白をスキップします。キーワード、リテラルなどのマッチャーは何もしません。なぜなら、空白を扱うことは自分のものではないからです。

キーワードが "静的"に配置されたときに一致するキーワードは、それを消費します。 "s"は数字ではないので、リテラルマッチは何もしません。空白スキッパーは、 "s"が空白文字ではないので、何もしません。

当然ながら、ループは入力文字列の終わりに達するまでカーソルを進め続けます。マッチャーの発注はもちろん重要です。それは文法的に正しくないフラグメントを処理し、また、他の言語の強調表示をサポートするために、個々のマッチャを拡張し、再利用しやすいように

このアプローチはいくつかのプログラミング言語はで書かれた正式な定義/仕様を持っている...

3

柔軟でもありますBackus-Naur Form。すべて*)プログラミング言語を記述することができます。あなたが必要とするのは、表記のためのパーサです。

*)例えば

を検証していない、C's BNF定義は、 "唯一の5つのページの長" です。

関連する問題