これは純粋な python ソリューションであり、実装が非常に簡単です。
体を抽出する関数
{
基本的に、それぞれを対応するものと一致させようとします}
:
{
次の前に2 つある場合}
は、スコープに入っています。
- 一方、
}
次の の前に1 つある場合{
は、スコープを終了しています。
実装は自明です。
{
のすべてのインデックスを探し}
、別のリストで維持する
- スコープ深度変数も維持します
- 現在の
{
位置が現在の位置よりも下にある}
場合は、スコープに入り、スコープの深さに 1 を追加して、次の{
位置に移動します。
- 現在の
{
位置が現在の位置よりも上にある}
場合、スコープを終了し、スコープの深さから 1 を削除して、次の}
位置に移動します。
- スコープ深度変数が 0 の場合、関数本体の右中括弧が見つかりました
関数本体の最初の中かっこ (中かっこを除く) の直後に始まる文字列があるとします。この部分文字列を指定して次の関数を呼び出すと、最後の中かっこの位置が得られます。
def find_ending_brace(string_from_first_brace):
starts = [m.start() for m in re.finditer('{', string_from_first_brace, re.MULTILINE)]
ends = [m.start() for m in re.finditer('}', string_from_first_brace, re.MULTILINE)]
i = 0
j = 0
current_scope_depth = 1
while(current_scope_depth > 0):
if(ends[j] < starts[i]):
current_scope_depth -= 1
j += 1
elif(ends[j] > starts[i]):
current_scope_depth += 1
i += 1
if(i == len(starts)): # in case we reached the end (fewer { than })
j += 1
break
return ends[j-1]
候補関数定義の抽出
ここで、ファイルの元の文字列が変数にある場合my_content
、
find_func_begins = [m for m in re.finditer("\w+\s+(\w+)\s*\((.*?)\)\s*\{", my_content)]
各関数のプロトタイプを提供します (find_func_begins[0].group(1) == func1
およびfind_func_begins[0].group(2) == 'int para')
, および
my_content[
find_func_begins[0].start():
find_func_begins[0].end() +
find_ending_brace(my_content[find_func_begins[0].end():])]
本体の中身をお届けします。
プロトタイプの抽出
find_func_begins
の正規表現は少し緩いので、最初の終了ブレースに到達した後で、関数定義をもう一度探す必要があると思います。各関数定義と一致する中括弧を反復すると、次の反復アルゴリズムが生成されます。
reg_ex = "\w+\s+(\w+)\s*\((.*?)\)\s*\{"
last = 0
protos = ""
find_func_begins = [m for m in re.finditer(reg_ex, my_content[last:], re.MULTILINE | re.DOTALL)]
while(len(find_func_begins) > 0):
function_begin = find_func_begins[0]
function_proto_end = last + function_begin.end()
protos += my_content[last: function_proto_end-1].strip() + ";\n\n"
last = function_proto_end + find_ending_brace(my_content[function_proto_end:]) + 1
find_func_begins = [m for m in re.finditer(reg_ex, my_content[last:], re.MULTILINE | re.DOTALL)]
欲しいものが入っているはずですprotos
。お役に立てれば!