0

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()

前もって感謝します

4

1 に答える 1

0

理論的には、これはほとんどうまくいきます:

re.sub(r'(if\s*\([^{]+\)\s*){([^;]*;)\s*}', r'\1\2', yourstring)

これは、ネストされた単一ステートメント ブロックと、文字列または文字リテラル内のセミコロンでは失敗することに注意してください。

一般に、正規表現を使用して C コードを解析しようとするのは悪い考えであり、とにかくこれらの中括弧を取り除くべきではありません。それらを持っていることは良い習慣であり、何も害はありません.

于 2012-08-14T01:16:34.657 に答える