Regex для разбора перечисления C ++ - PullRequest
4 голосов
/ 23 августа 2011

Как создать регулярное выражение для анализа перечислений C ++? Перечисления, которые я примерил, выглядели как

enum Temperature
{
    C = 0,
    F=1,     // some elements are commented
    R,       // most elements are not gived a value
    K        // sometimes the last element is succeeded by a comma
} temperature;

// different indent style is used
enum Depth {
    m = 0,
    ft = 1,
} depth;

Я пробовал несколько простых шаблонов, но ни один из них не является достаточно общим, чтобы охватить все случаи выше.

Любой мастер регулярных выражений, который может мне помочь?

Изменить: чтобы уточнить, я хочу имя и значение, например, С и 0.

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Это было непросто :) Ниже приведено лучшее, что я мог придумать.Предполагая, что ему дано только текст между {и} , он захватывает все имена и соответствующие значения:

/(\w+)\s*(?:=\s*(\d+)|)\s*,?\s*(?:(?:\n|$)|\/\/.*?(?:\n|$)|)/
0 голосов
/ 06 августа 2012

Если мы используем регулярное выражение для соответствия enum, а не используем его для анализа enum. Я думаю, что это возможно. попробуйте выполнить следующие действия:

step1. убедитесь, что исходный код C / C ++ может быть успешно скомпилирован.
шаг 2. убрать все комментарии из исходного кода C / C ++.
шаг 3. соответствие enum

рабочий код Ruby:

# copy from Mastering Regular Expression 3rd
COMMENT = '/\*[^\*]*\*+(?:[^/*][^*]*\*+)*/'
COMMENT2 = '//[^\n]+'
DOUBLE = '"(?:\\.|[^\\"])*"'
SINGLE = '\'(?:\\.|[^\\\'])*\''
# pattern for match enum
ENUM = '\benum\s*(\w+)\s*\{(\s*\w+(?:\s*=\s*\w+)?(?:\s*,\s*\w+(?:\s*=\s*\w+)?)*)\s*(?:,\s*)?\}\s*\w+\s*;'

foo = File.open("foo.cpp", "r").read()
# strip all comments from foo.cpp
foo.gsub!(/(#{DOUBLE}|#{SINGLE})|#{COMMENT}|#{COMMENT2}/, '\1')
bar = []
# match enum...
foo.scan(/#{ENUM}/) do | m |
    printf("%s: %s\n", m[0], m[1].gsub(/\s/, ''))

end

Выход:

Temperature: C=0,F=1,R,K
Depth: m=0,ft=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...