Linuxカーネルのクリーンアップを少し自動化できるスクリプトを作成しようとしていました。私の議題の最初のことは、単一のステートメントブロックに必要ではなかったifステートメント(c-styled)の括弧({})を削除することでした。これで、Pythonでの正規表現の知識がほとんどない状態で試したコードは、次のような動作状態になりました。
if (!buf || !buf_len) {
TRACE_RET(chip, STATUS_FAIL);
}
スクリプトはそれを次のように変換します。
if (!buf || !buf_len)
TRACE_RET(chip, STATUS_FAIL);
それは私が望むものですが、実際のソースファイルで試してみると、ランダムにifステートメントを選択し、削除された最初のブレースを取得し、複数のステートメントブロックがあり、通常は他の条件でプログラムのはるか下の最後のブレースを削除するようですまたは長いifステートメント。
したがって、誰かがスクリプトに単一のブロックステートメントがある場合にのみifステートメントに触れさせ、対応する開始と終了の括弧を正しく削除するのを手伝ってくれませんか。
正しいスクリプトは次のようになります。
from sys import argv
import os
import sys
import re
get_filename = argv[1]
target = open(get_filename)
rename = get_filename + '.tmp'
temp = open(rename, 'w')
def if_statement():
look=target.read()
pattern=r'''if (\([^.)]*\)) (\{)(\n)([^>]+)(\})'''
replacement=r'''if \1 \3\4'''
pattern_obj = re.compile(pattern, re.MULTILINE)
outtext = re.sub(pattern_obj, replacement, look)
temp.write(outtext)
temp.close()
target.close()
if_statement()
前もって感謝します