2009-06-15 2 views
1

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

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

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

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

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

EDIT: Это всегда одна и та же структура, но уравнения меняются.

Заранее благодарен!

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

+0

Это одноименное имя/структура? такая же вставка? поддерживает ли ваша реализация регулярного выражения IDE захваченное задание (или «повторение возврата», как \ 1 в выражении поиска)? –

ответ

0

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

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

Вы можете написать ваша новая структура массива как:

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

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

0

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

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

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

2

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

+0

Это звучит точно так же, как и копчинелла. – hlovdal