3

次のようなC関数プロトタイプ(特定のWindows APIヘッダーファイル)があります。

int
foo
(
int
a
,
int
*
b
)
;

(コーディング規約がないようです)

これをプログラムでフォームの1行のプロトタイプ(またはそれに近いもの)に変換しようとしています:

int foo(int a, int * b);

私はctags(ctagsマルチラインC関数プロトタイプ)のようなプログラムとuncrustify(http://uncrustify.sourceforge.net/)のさまざまな設定を調べましたが、どちらも前進することができませんでした。(どんな洞察も素晴らしいでしょう、あるいは私が逃した385のクラスト化されていないオプションの1つは私が望むことをします)。

プログラムで、関数プロトタイプを表す一意のマーカーを探して、自分の好みに合わせてコードをフォーマットするスクリプトを記述できるようにしています。

レクサーとパーサーを使用しないと、非常に複雑になる可能性があります。助言がありますか?

4

4 に答える 4

4

それらを実行するindent -krastyle --style=kr

于 2011-07-25T21:45:04.863 に答える
1

vimを使用した解決策?

intにマーカーを置き、11J

于 2011-07-25T21:44:17.377 に答える
1
sed ':a;N;$!ba;s/\n/ /g' prototypes.file  | sed 's/; */;\n/g'

最初のコマンド(パイプの前)はすべての改行をスペースに置き換え、次のコマンドはすべてのセミコロンの後に改行を戻します。

もちろん、これは、ファイルにこれらのプロトタイプ以外に何もない場合にのみ機能します。他にそのままにしておきたいものがある場合は、vimの視覚的選択と2つの置換コマンドを使用できます。

参加したい地域を選択してください

:s/\n/ /

結合された線を選択し、

:s/; */;\r/g
于 2011-07-25T22:49:42.127 に答える
0

viを使用した別の解決策:

すべての改行を削除して正規表現検索を実行します。次に、結果の混乱を取り、それぞれ;をに置き換えて別の正規表現検索を実行し; \n\nます。これで、プロトタイプのリストが残り、各プロトタイプの間に行がスキップされます。プロトタイプの始まりではなく終わりをマークし、すべてのプロトタイプが同じように終了するため、特別なケースを認識しないことを心配する必要はありません。

于 2011-07-25T21:56:27.683 に答える