Далее следует регулярное выражение, которое я написал для соответствия многострочным макросам препроцессора в коде C / C++. Я ни в коем случае не гуру регулярных выражений, поэтому был бы рад любым советам, как я могу это сделать лучше.
Вот регулярное выражение:
\s*#define(.*\\n)+[\S]+(?!\)
Он должен соответствовать всему этому:
#define foo(x) if (x) \
doSomething(x)
Но только некоторые из них (не должны соответствовать следующей строке кода:
#define foo(x) if (x) \
doSomething(x)
normalCode();
А также не должны совпадать с однострочными макросами препроцессора.
Я почти уверен, что приведенное выше регулярное выражение работает, но, как я уже сказал, вероятно, есть лучший способ сделать это, и я полагаю, что есть способы его сломать. Кто-нибудь может что-нибудь предложить?






Это простая тестовая программа, которую я придумал:
#!/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)+.*$"
Очень похоже на одно использованное использование, изменения:
start = r"^\s*#define\s+"
continuation = r"(?:.*\\n)+"
lastline = r".*$"
re_multiline_macros = re.compile(start + continuation + lastline,
re.MULTILINE)