регулярное выражение Python для соответствия многострочному макросу препроцессора - PullRequest
5 голосов
/ 13 сентября 2008

Ниже приведено регулярное выражение, которое я написал для соответствия многострочным макросам препроцессора в коде C / C ++. Я ни в коем случае не гуру регулярных выражений, поэтому буду рад любым советам о том, как я могу сделать это лучше.

Вот регулярное выражение:

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

Это должно соответствовать всем этим:

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

Но только некоторые из них (не должны соответствовать следующей строке кода:

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

А также не должен совпадать с однострочными макросами препроцессора.

Я почти уверен, что приведенное выше регулярное выражение работает, но, как я уже сказал, возможно, есть лучший способ сделать это, и я предполагаю, что есть способы его сломать Кто-нибудь может предложить что-нибудь?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2008

Это простая тестовая программа, которую я выбил:

#!/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. Я полагаюсь на + бытие жадный, поэтому я могу использовать простой. * $ в конец, чтобы получить первую строку определить, что не заканчивается \
4 голосов
/ 13 сентября 2008
start        = r"^\s*#define\s+"
continuation = r"(?:.*\\\n)+"
lastline     = r".*$"

re_multiline_macros = re.compile(start + continuation + lastline, 
                                 re.MULTILINE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...