5

以下は、C / C++ コードの複数行のプリプロセッサ マクロに一致するように作成した正規表現です。私は決して正規表現の第一人者ではないので、これを改善する方法についてアドバイスをいただければ幸いです。

正規表現は次のとおりです。

\s*#define(.*\\\n)+[\S]+(?!\\)

次のすべてに一致する必要があります。

#define foo(x) if(x) \
doSomething(x)

ただし、これの一部のみです (次のコード行と一致しないでください:

#define foo(x) if(x) \
doSomething(x)
normalCode();

また、単一行のプリプロセッサ マクロと一致するべきではありません。

上記の正規表現が機能することはかなり確信していますが、前述したように、おそらくもっと良い方法があり、それを破る方法があると思います。誰でも提案できますか?

4

2 に答える 2

5

これは、私が作成した簡単なテスト プログラムです。

#!/usr/bin/env python

TEST1="""
#include "Foo.h"
#define bar foo\\
    x
#include "Bar.h"
"""

TEST2="""
#define bar foo
#define x 1 \\
    12 \\
    2 \\\\ 3
Foobar
"""

TEST3="""
#define foo(x) if(x) \\
doSomething(x)
"""

TEST4="""
#define foo(x) if(x) \\
doSomething(x)
normalCode();
"""

import re
matcher = re.compile(r"^[ \t]*#define(.*\\\n)+.*$",re.MULTILINE)

def extractDefines(s):
    mo = matcher.search(s)
    if not mo:
        print mo
        return
    print mo.group(0)

extractDefines(TEST1)
extractDefines(TEST2)
extractDefines(TEST3)
extractDefines(TEST4)

私が使用したもの:

r"^[ \t]*#define(.*\\\n)+.*$"

使用されているものと非常に似ていますが、変更点は次のとおりです。

  1. [ \t] 定義の開始時に改行を避けるため。
  2. 私は貪欲な + に依存しているので、最後に単純な .*$ を使用して、\ で終わらない定義の最初の行を取得できます。
于 2008-09-13T17:46:14.867 に答える
4
start        = r"^\s*#define\s+"
continuation = r"(?:.*\\\n)+"
lastline     = r".*$"

re_multiline_macros = re.compile(start + continuation + lastline, 
                                 re.MULTILINE)
于 2008-09-13T17:53:30.713 に答える