11

私はいくつかの学習に着手しており、C++ でファイルの独自の構文強調表示を作成したいと考えています。

誰かがこれを行う方法についてアイデアを教えてもらえますか?

私には、ファイルを開くと次のように見えます。

  1. 解析して、ソース ファイルの種類を判断する必要があります。拡張機能を信頼することは、絶対確実ではないかもしれません

  2. どのキーワード/コマンドがどの言語に適用されるかを知る方法

  3. 各キーワード/コマンドが取得する色を決定する方法

C++またはObjective-Cを使用して、OS Xでこれを行いたいです。

これをどのように開始するかについて、誰かが指針を提供できますか?

4

4 に答える 4

16

通常、シンタックス ハイライターは字句解析を超えることはありません。つまり、言語全体をステートメント、宣言、式などに解析する必要はありません。レクサーを作成するだけで済みます。これは、正規表現を使用するとかなり簡単です。まだ正規表現を学んでいない場合は、正規表現を学ぶことから始めることをお勧めします。全部で30分かかります。

学習課題として、Flex (字句解析ジェネレーター; https://github.com/westes/flex ) をいじることを検討してみてください。強調表示された HTML などを出力する基本的な構文ハイライターを Flex に実装するのは非常に簡単なはずです。

つまり、Flex に一連の正規表現と一致するテキストをどう処理するかを指定すると、ジェネレーターはその表現に対して貪欲に一致します。flex FAQに示されているように、排他的な状態 (文字列リテラルの内外、コメントなど) 間でレクサーを遷移させることができます。Flex で記述された C 用の字句解析器の標準的な例を次に示します: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html

拡張可能な構文ハイライターを作成することは、旅の次の部分です。私は決して XML のファンではありませんが、Kate の構文強調表示ファイルがどのように定義されているかを見てください。これは C++ 用のものです。あなたの仕事は、構文ハイライターをどのように定義したいかを理解し、それらの定義を使用して HTML などを生成するプログラムを作成することです。

于 2010-04-17T01:43:55.540 に答える
1

GeSHIがハイライトなどをどのように実装しているかを確認することをお勧めします。さらに、必要なすべてのキーワードを含む言語パックがたくさんあります。

于 2010-04-17T01:53:49.643 に答える
0

ファイルが有効なC++であるかどうかを確認する唯一の方法は、C++パーサーを介して実行し、解析するかどうかを確認することであるため、(1)は不可能だと思います...しかし、それを標準として使用した場合、できませんでした.進行中の作業であるためコンパイルできないコードを操作しないでください。おそらく実行したいでしょう。他の方法はそれよりうまく機能するとは思わないので、拡張機能を信頼するのがおそらく最善です。

ここで C++ キーワードのリストを取得できます: http://www.cppreference.com/wiki/keywords/start

色はあなた次第です(または、必要に応じて、構成可能にしてユーザーに選択を任せることができます)

于 2010-04-17T01:32:51.073 に答える
0

Cocoa フレームワークを使用していると仮定すると、UTI を使用してファイル タイプを判別できます。

API の概要:

http://developer.apple.com/mac/library/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319-CH201-SW1

既知の UTI のリスト:

http://developer.apple.com/mac/library/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

おそらく最も関心のある 2 つのキーは、kUTTypeObjectiveC PlusPlusSource と kUTTypeCPlusPlusHeader です。

強調表示については、NSView と一時属性を使用した構文の強調表示について説明しているため、このページの情報が役立つ場合があります。

http://www.cocoadev.com/index.pl?ImplementSyntaxHighlightingUsingTemporaryAttributes

于 2010-04-17T02:12:02.833 に答える