Вставка кода в код
От: Naota  
Дата: 08.04.08 07:06
Оценка:
Задача:
Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.

Как я делал:
Первая реализация создавала структуру: таблица функций (имя функции, код функции). Но такой способ оказался неверным, так как нужно было форматировать код самому, удаляя комменты.

Вторая реализация создавала структуру: таблица функций (имя функции, индекс начала тела и длена). Индекс указывал на номер слова в файле. Но от этого то же пришлось отказаться, так как при вставке кода в файл, все индексы смещались.

Третьия реализация создавала структуру: таблица функций (имя функции, указатель на начало тела и указатель на конец тела). Перед тем как искать маркер в функции, нужно: очистить от лишнего кода функцию и сам маркер. Что бы искать маркер не чисто текст, а по логике языка. Но тут возникает проблема. Вот мы нашли маркер в очищенном коде, но как получить местоположение этого маркера в неочищенном коде?

Можно вообще не очищать кода, а сразу искать маркер в функции, попутно пропуская незначащие слова. Не очень хорошая штука выходит, но пока идей нету.

Может у кого-то есть идеи другой реализации или ещё чего...
Re: Вставка кода в код
От: varnie  
Дата: 08.04.08 08:21
Оценка:
Здравствуйте, Naota, Вы писали:

[...]

а на регекспы вы смотрели?
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[2]: Вставка кода в код
От: Аноним  
Дата: 08.04.08 08:51
Оценка:
Здравствуйте, varnie, Вы писали:

V>Здравствуйте, Naota, Вы писали:


V>[...]


V>а на регекспы вы смотрели?


На регекспы мы смотрели, но как зачем они в этой задаче?
Re: Вставка кода в код
От: varnie  
Дата: 08.04.08 09:03
Оценка:
Здравствуйте, Naota, Вы писали:

N>Задача:

N>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.

немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка.
про маркер поподробнее напиши.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[2]: Вставка кода в код
От: Naota  
Дата: 08.04.08 09:18
Оценка:
Здравствуйте, varnie, Вы писали:

V>Здравствуйте, Naota, Вы писали:


N>>Задача:

N>>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.

V>немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка.

V>про маркер поподробнее напиши.

Маркер — это участок кода(хранится в виде списка слов), который нужно искать в файле. А дальше вставлять тект тремя возможными способами.
Re[3]: Вставка кода в код
От: varnie  
Дата: 08.04.08 09:43
Оценка:
Здравствуйте, Naota, Вы писали:

N>Здравствуйте, varnie, Вы писали:


V>>Здравствуйте, Naota, Вы писали:


N>>>Задача:

N>>>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.

V>>немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка.

V>>про маркер поподробнее напиши.

N>Маркер — это участок кода(хранится в виде списка слов), который нужно искать в файле. А дальше вставлять тект тремя возможными способами.


дык и выходит, что по сути нужен регексп.
псевдокод такой:
while (не конец файла){
взять_текущую_строку;
for_each(вставка из списка){
if (рег_выражение(текущая_строка, вставка) == true){
смотрим на способ вставки, и апдейтим текущую строку одним из трех способов (вставка перед/после/полная_замена)
}
}
}
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[4]: Вставка кода в код
От: Naota  
Дата: 08.04.08 09:57
Оценка:
Здравствуйте, varnie, Вы писали:

V>Здравствуйте, Naota, Вы писали:


N>>Здравствуйте, varnie, Вы писали:


V>>>Здравствуйте, Naota, Вы писали:


N>>>>Задача:

N>>>>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.

V>>>немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка.

V>>>про маркер поподробнее напиши.

N>>Маркер — это участок кода(хранится в виде списка слов), который нужно искать в файле. А дальше вставлять тект тремя возможными способами.


V>дык и выходит, что по сути нужен регексп.

V>псевдокод такой:
V>while (не конец файла){
V> взять_текущую_строку;
V> for_each(вставка из списка){
V> if (рег_выражение(текущая_строка, вставка) == true){
V> смотрим на способ вставки, и апдейтим текущую строку одним из трех способов (вставка перед/после/полная_замена)
V> }
V> }
V>}
Угу, круто, ток при чем здесь построчная обработка О_О. Это не INI файл все таки. Но спасибо за раздумья.
Регэкспу тут не применить, хотя бы потому, что в Lua сложно оформляются многострочные-комменты/строки. Конечно можно лепить регэкспы из списка слов вставки, но это, кхм.. извратом попахивает.
Re[5]: Вставка кода в код
От: varnie  
Дата: 08.04.08 10:32
Оценка:
Здравствуйте, Naota, Вы писали:

N>Угу, круто, ток при чем здесь построчная обработка О_О. Это не INI файл все таки. Но спасибо за раздумья.

N>Регэкспу тут не применить, хотя бы потому, что в Lua сложно оформляются многострочные-комменты/строки. Конечно можно лепить регэкспы из списка слов вставки, но это, кхм.. извратом попахивает.

вот хотя бы краткое описалово php ф-ции ereg_replace:
string ereg_replace(string pattern, string replacement, string string)

данная ф-ция скапнирует строку, уазанную в параметре $string на совпадения с выражением, указанным в параметре $pattern, и заменяет найденный текст на указанный в параметре $replacement.


почитай все же хотя бы описание php ф-ций по регекспам (ну или аналогичное в том же перле , руби итд, благо, выбор есть).
еще можно сделать вот как: раскидать все твои списки на апдейт по трем отдельным категориям (массивам,спискам,векторам итд). т.е. в первом будут храниться списки, которые требуется при определенном совпадении с исходными данными вставить _перед_ найденным паттерном. во втором — списки, которыми нужно перезаписать найденный паттерн, в третьем — списки, которые нужно вставить _после_ найденного паттерна. а потом прогнать регексп(ы) по всему исходному сорцу твоему, последовательно используя сначала список1, затем список2, список3.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[6]: Вставка кода в код
От: Naota  
Дата: 08.04.08 11:26
Оценка:
Здравствуйте, varnie, Вы писали:

V>Здравствуйте, Naota, Вы писали:


N>>Угу, круто, ток при чем здесь построчная обработка О_О. Это не INI файл все таки. Но спасибо за раздумья.

N>>Регэкспу тут не применить, хотя бы потому, что в Lua сложно оформляются многострочные-комменты/строки. Конечно можно лепить регэкспы из списка слов вставки, но это, кхм.. извратом попахивает.

V>вот хотя бы краткое описалово php ф-ции ereg_replace:

V>string ereg_replace(string pattern, string replacement, string string)
V>

данная ф-ция скапнирует строку, уазанную в параметре $string на совпадения с выражением, указанным в параметре $pattern, и заменяет найденный текст на указанный в параметре $replacement.


V>почитай все же хотя бы описание php ф-ций по регекспам (ну или аналогичное в том же перле , руби итд, благо, выбор есть).

V>еще можно сделать вот как: раскидать все твои списки на апдейт по трем отдельным категориям (массивам,спискам,векторам итд). т.е. в первом будут храниться списки, которые требуется при определенном совпадении с исходными данными вставить _перед_ найденным паттерном. во втором — списки, которыми нужно перезаписать найденный паттерн, в третьем — списки, которые нужно вставить _после_ найденного паттерна. а потом прогнать регексп(ы) по всему исходному сорцу твоему, последовательно используя сначала список1, затем список2, список3.

я на секунду да же обрадовался..но нет, регэксп не умеет работать с вложениями. Как ты им найдешь конец функции? Да и строки-комменты имеют синтаксис не поддающийся разбору через регэкспу.
Re: Вставка кода в код
От: Naota  
Дата: 08.04.08 11:45
Оценка:
Нашел другой способ решить проблему. Пока вопросов больше нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.