Задача:
Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.
Как я делал:
Первая реализация создавала структуру: таблица функций (имя функции, код функции). Но такой способ оказался неверным, так как нужно было форматировать код самому, удаляя комменты.
Вторая реализация создавала структуру: таблица функций (имя функции, индекс начала тела и длена). Индекс указывал на номер слова в файле. Но от этого то же пришлось отказаться, так как при вставке кода в файл, все индексы смещались.
Третьия реализация создавала структуру: таблица функций (имя функции, указатель на начало тела и указатель на конец тела). Перед тем как искать маркер в функции, нужно: очистить от лишнего кода функцию и сам маркер. Что бы искать маркер не чисто текст, а по логике языка. Но тут возникает проблема. Вот мы нашли маркер в очищенном коде, но как получить местоположение этого маркера в неочищенном коде?
Можно вообще не очищать кода, а сразу искать маркер в функции, попутно пропуская незначащие слова. Не очень хорошая штука выходит, но пока идей нету.
Может у кого-то есть идеи другой реализации или ещё чего...
Здравствуйте, Naota, Вы писали:
N>Задача: N>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.
немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка.
про маркер поподробнее напиши.
Здравствуйте, varnie, Вы писали:
V>Здравствуйте, Naota, Вы писали:
N>>Задача: N>>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.
V>немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка. V>про маркер поподробнее напиши.
Маркер — это участок кода(хранится в виде списка слов), который нужно искать в файле. А дальше вставлять тект тремя возможными способами.
Здравствуйте, Naota, Вы писали:
N>Здравствуйте, varnie, Вы писали:
V>>Здравствуйте, Naota, Вы писали:
N>>>Задача: N>>>Есть файл, с кодом на языке Lua, и есть список вставок другого кода в этот файл. Вставки разделяются на вставки в функции и вставки вне функций. У вставок есть способ вставки, маркер и вставляемый код. Вставлять можно тремя способами, перед/после/заменить. Маркер это то же код.
V>>немного неясно все же, каким образом предполагается/хочется апдейтить исходные данные вставками из списка. V>>про маркер поподробнее напиши.
N>Маркер — это участок кода(хранится в виде списка слов), который нужно искать в файле. А дальше вставлять тект тремя возможными способами.
дык и выходит, что по сути нужен регексп.
псевдокод такой:
while (не конец файла){
взять_текущую_строку;
for_each(вставка из списка){
if (рег_выражение(текущая_строка, вставка) == true){
смотрим на способ вставки, и апдейтим текущую строку одним из трех способов (вставка перед/после/полная_замена)
}
}
}
Здравствуйте, 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 сложно оформляются многострочные-комменты/строки. Конечно можно лепить регэкспы из списка слов вставки, но это, кхм.. извратом попахивает.
Здравствуйте, Naota, Вы писали:
N>Угу, круто, ток при чем здесь построчная обработка О_О. Это не INI файл все таки. Но спасибо за раздумья. N>Регэкспу тут не применить, хотя бы потому, что в Lua сложно оформляются многострочные-комменты/строки. Конечно можно лепить регэкспы из списка слов вставки, но это, кхм.. извратом попахивает.
вот хотя бы краткое описалово php ф-ции ereg_replace:
string ereg_replace(string pattern, string replacement, string string)
данная ф-ция скапнирует строку, уазанную в параметре $string на совпадения с выражением, указанным в параметре $pattern, и заменяет найденный текст на указанный в параметре $replacement.
почитай все же хотя бы описание php ф-ций по регекспам (ну или аналогичное в том же перле , руби итд, благо, выбор есть).
еще можно сделать вот как: раскидать все твои списки на апдейт по трем отдельным категориям (массивам,спискам,векторам итд). т.е. в первом будут храниться списки, которые требуется при определенном совпадении с исходными данными вставить _перед_ найденным паттерном. во втором — списки, которыми нужно перезаписать найденный паттерн, в третьем — списки, которые нужно вставить _после_ найденного паттерна. а потом прогнать регексп(ы) по всему исходному сорцу твоему, последовательно используя сначала список1, затем список2, список3.
Здравствуйте, 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.
я на секунду да же обрадовался..но нет, регэксп не умеет работать с вложениями. Как ты им найдешь конец функции? Да и строки-комменты имеют синтаксис не поддающийся разбору через регэкспу.