シェルスクリプトを使用して与えられたc / cppファイルから関数定義/内容を抽出するには?

シェルスクリプトを使用して与えられたc / cppファイルから関数定義/内容を抽出するには?

頭を傷つけ、次のような結果を得ました。次のような.cファイルがあるとしましょう。

file.c
int fun1()
{
  int x = 3;
  return x;}
void f2()
{
   int x= 7; 
   int y =0;
}

関数名と本文のみをインポートして他のファイルに書き込む方法を教えてくれる人はいますか? ctags、grepなどを試しました。関数名だけを取得し、本文は取得できませんでした。

ベストアンサー1

関数名と本文のみをインポートして他のファイルに書き込む方法を教えてくれる人はいますか? ctags、grepなどを試しました。関数名だけを取得し、本文は取得できませんでした。

構文を実際に理解する必要があります。 Grepと同僚はCまたはC ++を解析できません。 awkなどと同様に、正規表現エンジンが解析できる言語の種類について数学的な説明があり、Cはこの言語カテゴリに属しておらず、C ++はCよりも解析するのが難しいです。 )。

ctags純粋な1990年代初頭の技術です(それ以来、CおよびC ++言語バージョンに翻訳すると、今日この技術に頼ることがなぜ疑わしいのかがわかります)。ほとんどのパーサベースの「ヒューリスティック」は、実際にCまたはC ++を完全に「理解する」には単純すぎます。そして気づいたように、知っていることに気を付けるのもどこシンボルはむしろコンテンツ任意の機能。 (私は豊富なctagを使っていましたが、最後のバージョンは2009だったので、C ++ 11 ++またはC 11 ++を解析することはできませんが、一般的なctagについてより良い話を聞きましたが、これはまだ文脈のないテキストです。多形性、ファイル肝臓テンプレートと基本的に、C ++は2003年以降に中規模から大規模なプロジェクトにインポートされたすべての機能を処理しないベースツール情報です。

したがって、悪いニュースは、機械語への実際の翻訳を除く完全なCコンパイラ(または完全なC ++コンパイラ)がある程度必要であるということです。したがって、自分でうまく機能するものを書くことはできません。このような複雑な言語を実装するには、チームが小さすぎます。

これいいねニュースは他人がそれを発明したということです一般的なツール(IDE、リンター、構文チェッカーなど)に非常に強力な言語パーサーへのアクセスを提供する方法であり、特にC ++の場合に選択できることが多いです。
(私はこの2つの非常に異なる言語を考えていますが、C ++がより難しい言語なので、C ++のサポートは驚くべきことです。実際にはANSI以前のCスタイルを使用したい場合以外は、C関数の内容を取得するパーサーです。

一部は言語サーバープロトコル(LSP)、これは(neo)vim、emacs、Spyder、VSCode、Kate...すべての「宣言に移動」、「エラーハイライト」、「インライン定義表示」機能を取得する方法です。言語サーバーLSPを使用して見えるものを理解します(clangdC ++用のネイティブLSPサーバー)。

あなたも同じことができます! LSPは複雑なプロトコルではありません。実際、これは一連のJSON-RPCリクエストです(JSON-RPC:「REST」と思いますが、HTTPの代わりにもっと簡単なものを使用し、「通常何があっても」代わりに常にJSONをロードします)。したがって、JSON-RPCコマンドラインクライアントを見つけて、clangdスクリプトから手動で起動し、CLIクライアントを使用してクライアントに要求する(LSP言語を使用)、CLIインタフェースを持つ既存のクライアントを採用できます。そしてそれを使用してください。

クライアントの複雑さは間違いなく好きではありませんが、LSPサーバーの複雑さをC ++(およびC)に解析する必要があることを考えると、クライアントコードを直接書くだけでは効率が大幅に得られません。だから私はneovimまたはemacsをバックグラウンド/デーモンモードにプッシュし、対応するスクリプトインターフェース(neovim:Lua、emacs:elisp)と対話します。

賭ける走るほど簡単だったらいいな

cool_tool \
  -symbol-content "myns::containers::coolcont<Owlfeet>::hoot(int, int, std::string)" \
  -source-file owls.cc

そして、hoot関数の内容を取得しますが、残念ながらC ++プロジェクトでは、シンボルがどのように形成されるのか、どのオーバーロードがどのファイルに実装されるのか、特定の関数実装の候補が何であるかさえわかりません。などを含むすべてのソフトウェアモジュールの概要を説明するコンパイル単位です。したがって、コンパイル方法の知識を持って使用しない場合は、C ++パーサーを失敗と見なす必要があります。これがC ++ LSPツールが通常IDEによく統合されており、複数のファイルを呼び出すことができない理由です。個別に電話して申し訳ありません。こんな悪い知らせをお伝えしてくれて申し訳ありません。clangd変更されていないか関連していなくても、含まれているすべてのファイルを1000回解析する必要なく、clangコンパイラの言語理解を使用して内部的に多くのことが行われます。

かなり薄くて軽いneovimを「CLIサポート」IDEとして使用すると、すべてがうまくいくでしょう。これは私が推奨できる単一のコマンドラインツールではありません。

通常、CやC ++ソースコードなどの複雑なデータを扱う場合、シェルスクリプトは単に構築したいツールではないかもしれません。非常に一般的な言語を扱う文章を書くことは、非常に一般的な言語のように感じます!

おすすめ記事