16

私は、コーディング フローに微妙ではあるが重大な影響を与える IDE 機能の適切な動作を文書化することの大ファンです。オートコンプリートの選択や、コードのコメント化/コメント解除など、利用していることに気付かないかもしれませんが、よりも少し多くのことを成し遂げた日。私が使用しなければならない他の言語サービスにその機能が組み込まれ、その後、日常のコーディング ライフが改善されることを期待してそうしています。「本物の」スマート インデント、つまり Visual Studio 2008 C# エディタは、それらの機能の 1 つです。

基本的なブロックコードのインデントはかなり簡単で、ジョブを完了するのに十分な時間で十分にハッキングできます。一方、True Smart Indent は、これまで IDE に実装しなければならなかった最も技術的に困難なタスクである可能性が非常に高く、公平な分担を実装しました。本格的なオンザフライの自動コード再フォーマットでさえ簡単です。面倒な作業は Smart Indent に任せるだけです。

汎用のスマート インデント アルゴリズムに関するハイレベルな議論を探しています。特に、スマート インデント戦略に関する研究、または反復可能でバグのない結果を保証するためにテストできるすべての通常および「エッジ」ケースの客観的な説明を探しています。最終的には、機能の詳細なワークフロー、機能を実際に実装するための具体的な基盤、そして最終的にそこから言語固有のバージョンを組み立てて言語サービスに統合することの両方を提供したいと考えています。

PS: Visual Studio 2010 の C# エディターには、この機能に小さなバグがいくつかあります。自分で実装したので、それを磨くために必要な作業にまったく新しい敬意を払っています.

編集 (8/25):スマート インデントがコード コメント内にある場合の処理​​方法について、ルールのドラフトを書き留めることができました。ルールについては、おそらく C++/C# の観点から作業する予定ですが、後で、他の言語の側面のためにパラメーター化できるようになるはずです。

4

4 に答える 4

5

Emacs CC モード マニュアル:インデント エンジンの基本

Steve Yegge ブログの暴言: js2-mode: Emacs の新しい JavaScript モード

後者からの引用: 「驚くべきことに、直観に反して、インデントの問題は構文解析と構文検証とほぼ完全に直交しています。」

于 2009-08-24T12:59:59.197 に答える
3

あなたが探している魔法の検索フレーズは「きれいな印刷物」かもしれません。

于 2009-08-26T02:18:37.793 に答える
2

他のレスポンダーと同様に、これを正しく行うための重要なアイデアはプリティプリンティングです。つまり、コードの抽象的な構文構造からテキストを生成します。

基本的に、ツリーのネストを利用して、印刷されたテキストのネストを生成します。重要なアイデアは、ツリーの葉からプリミティブ文字列を作成する、サブツリーの他のボックスと水平ボックス [テキストの長方形] を接着して水平構成を提供する、ボックスを相互に接着してより大きな垂直ボックスを作成する、という概念です。

トリッキーな部分: ツリー リーフからの書式設定情報を使用して言語リテラルを再生成する (その 2 進浮動小数点数には先頭のゼロがいくつあるか?)、代替ボックス レイアウトとバックトラックを許可することによる右マージン オーバーフローの処理、複雑なツリー構造のプリティプリントへのパターン マッチング適切な方法で特定のツリー (たとえば、ネストされた if-then-if-then-if ....)

このトピックに関する研究論文(全文 PDF)を次に示します。

大規模なメタプログラミングによって生成された AST をプリティプリントするために、DMS Software Reengineering Toolkitを使用してプリティプリントするために行ったことを次に示します。

于 2009-09-03T03:30:44.707 に答える
1

何かが足りないかもしれませんが、「スマートインデント」は言語の文法仕様に完全に縛られています。少しのgoogle-fuの後で見つけた学術論文に最も近いものは、実際、特定の言語に関する別のSOの質問でし

ですから、学術論文が見つからなかったので、技術的に答えを提供することはできませんが、一種のメタ回答として(悲しいことに、質問の形で):それは解析するよりも難しいですか?言語?私は、人が実際に費やす実際の時間/労力/涙を指すのではなく、漠然とした計算可能性/複雑さの意味で「より難しい」という用語を使用します。

考えてみてください。私の経験では、特定の副節内でインデントレベルが変化します。ifステートメント、ループ、クラス、構造体など。これらはすべて、パーサーによってすでに検出されています。解析ツリーを装飾してセマンティックツリーを構築できるのと同じように(これはランダムな大学のWebサイトの断片です)、代わりに「インデント情報」で解析ツリーを装飾することはできませんか?

学術論文の募集が何なのかわからないと思います。もちろん、私が見逃しているものがない限り。私は確かにこれを敢えて試みたことがないので、これはかなり可能です。:)しかし、私の見地からすると、このスマートなインデントは、変更されたパーサーを実行するだけで可能であり、「解析エラー」を報告する代わりに、コードが有効になるように自動的に再フォーマットされます(「実際の「パーサーはすでにブロックを大丈夫です)。リアルタイム実行は確かに問題を引き起こし、空白に依存する言語にはあいまいなレベルのインデントがあります(インデントレベルブロックの終わりであるため)。

最後に(正直なところ、ほぼ完了です!:))注:私の経験では、Emacsのテキスト編集は驚くほど優れています。それがどのように機能するかはわかりませんが、これを試してみると、それが最初に見る場所になります...もちろん、SOの後です。:))

于 2009-08-24T03:31:43.633 に答える