Регулярное выражение для рефакторинга массивов - PullRequest
1 голос
/ 15 июня 2009

У меня есть очень большой проект программирования на C, который использует тысячи переменных структуры с этим соглашением об именах:

specificstruct->x = specificstruct->y + specificstruct->z

Я хочу провести серьезный рефакторинг, а именно преобразовать большинство этих элементов структуры в массивы. Код выше будет выглядеть так:

specificstruct->x[i] = specificstruct->y[i] + specificstruct->z[i]

... и мне не хочется тратить целый день на все это вручную. У кого-нибудь есть подходящее регулярное выражение в магазине?

РЕДАКТИРОВАТЬ: Это всегда одна и та же структура, но уравнения различаются.

Заранее спасибо!

С наилучшими пожеланиями, П. Нильссон

Ответы [ 4 ]

2 голосов
/ 15 июня 2009

Я не уверен в вашем конкретном случае, но, возможно, Coccinelle может вам помочь. Это система для исправления исходного кода, основанная на некоторых правилах, таких как «если x - выражение без вызовов функций, измените x + x на 2 * x» и т. Д.

0 голосов
/ 15 июня 2009

s/\(specificstruct->x\) = \(specificstruct->y\ )\+ \(specificstruct->z\)/\1[i] = \2[i] + \3[i]/g

0 голосов
/ 15 июня 2009

Если вы просто ищете имя, за которым следует -> затем один символ, вы можете попробовать

(?<struct>\w+)\s?->\s?(?<var>\w{1}) //single char after ->
(?<struct>\w+)\s?->\s?(?<var>\w+) //multiple char after ->

Таким образом, у вас есть группы, чтобы вы могли сравнить имена, прежде чем делать какие-либо замены. \ S? помогает сопоставить, даже если вы добавили интервал между одними, но не другими.

0 голосов
/ 15 июня 2009

Для обобщенного подхода следует сделать что-то подобное - предполагается, что вы получили постоянный интервал между выражениями

(.*?->.) = (.*?->.) \+ (.*?->.)

Затем вы можете написать новую структуру массива как:

\1[i] = \2[i] + \3[i]
...