Здравствуйте, AndrewVK, Вы писали:
Последний вариант от Gapteron можно переписать "близко к тексту" для кодогенератора на основе ASP.Net — движка.
Это, ИМХО, немного не то (вернее — совсем не то).
Я вижу основную идею в том, чтобы просто иметь правила трансформации одних структур в другие. Тривиальный подход — типа наложения шаблона на императив, несет в себе потенциально большую трудоемкость в плане поддержки и развития. Т.е. для развития функциональности придется бегать по всему шаблону и по коду, располагающемуся м/у шаблонными вставками.
В то время как в том же Пролог достаточно будет просто добавить очередное правило.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, AndrewVK, Вы писали:
V>Последний вариант от Gapteron можно переписать "близко к тексту" для кодогенератора на основе ASP.Net — движка.
Да ну?
![](/Forum/Images/wow.gif)
Попробуй переписать на ASP.NET вот эти три строки — на самом деле все дело в них, а не в отдельной функции, генерирующей текст для одного узла.
parsetree( [ H | T ] ) -> parsetree( H ) ++ parsetree( T );
parsetree( [] ) -> "";
parsetree( Node ) -> Node.tag( Node ).
V>Это, ИМХО, немного не то (вернее — совсем не то).
V>Я вижу основную идею в том, чтобы просто иметь правила трансформации одних структур в другие.
Любая программа на ФЯ, обрабатывающая дерево, является ни чем другим как декларативным описанием этих правил трансформации. Код я привел на измененном Erlang, который — ФЯ.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, AndrewVK, Вы писали:
AVK>>>Итак — требуется придумать язык, заточенный под кодогенерацию (не модификацию!) на современных мейнстрим языках —
VD>>А я вот с удовольствием послушал бы идеи о языке для модификации.
V>Пролог
Реши на нем
эту задачкуАвтор: AndrewVK
Дата: 13.07.05
.
Здравствуйте, vdimas, Вы писали:
V>ИМХО, из популярных Пролог вполне подходит.
Пример?
V>Разработай форматы входных данных вместе с кодогенератором (по мере скурпулезного уточнения требований к формату)
Мне не нужен один едиснтвенный формат, мне нужна возможность работать с тем форматом, который наиболее удобен в каждом конкретном случае.
V>Попутный вопрос — исходные данные для кодогенерации хранятся в некоем репозитории? Какой к нему интерфейс?
Неважно. Пусть это будет текстовый файл.
AVK>>3) Возможность работы с несколькими источниками входных данных.
V>В смыле — с различными форматами?
В смысле одновременно с несколькими источниками. Например с несколькими файлами.
... << RSDN@Home 1.2.0 alpha rev. 572>>
Вспомнил одну штуку, которую где то видел. Итак, задачка из топика про лисп.
public class SampleCodegen : Codegen
{
[Match("/objects")]
private void Objects(ICodegenContext context)
{
ApplyTemplates(context);
}
[Match("object")]
private void Object(ICodegenContext context)
{
WriteLine("public class {0}", context.Select("@name"));
WriteLine("{");
MakeCtor(context);
ApplyTemplates(context);
WriteLine("}");
}
[Match("property")]
private void Property(ICodegenContext context)
{
string type = context.Select("@type");
string name = context.Select("@name");
WriteLine(@"
private {0} _{1};
public {0}, {2}
{
get
{
return _{1};
}
}", type, name, Capitalize(name));
}
private void MakeCtor(ICodegenContext context)
{
Write("public {0}(", node.Name);
bool first = true;
foreach (ICodegenContext child in context.Select("property"))
{
if (!first)
{
Write(", ");
first = false
}
Write("{0} {1}", child.Select("@type"), child.Select("@name"));
}
}
private static void Main(string[] args)
{
new SampleCodegen("c:\objects.xml").Transform(Console.Out);
}
}
... << RSDN@Home 1.2.0 alpha rev. 572>>
Здравствуйте, Mikl Kurkov, Вы писали:
MK>Если объединить грамматики исходного и целевого языка, то генерация станет трансформацией.
MK>Кроме того не обязательно сразу расписывать полную грамматику, можно начать с упрощенной, постепенно усложняя по мере необходимости. А строгая проверка типов может сильно облегчить этот процесс. Кстати язык имеет встроенные стредства такого постепенного уточнения грамматик.
А ты им сам пользовался? Меня вот интересует их язык трасформаций. Насколько он удобен?
... << RSDN@Home 1.2.0 alpha rev. 557>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Вспомнил одну штуку, которую где то видел. Итак, задачка из топика про лисп...
И? Что ты хотел этим сказать?
... << RSDN@Home 1.2.0 alpha rev. 557>>
Здравствуйте, VladD2, Вы писали:
> А ты им сам пользовался? Меня вот интересует их язык трасформаций.
> Насколько он удобен?
Серьезного ничего я с ним не делал. Так поигрался немного.
Правила трансформации описываются на чистом функциональном языке с паттерн матчингом. Эти правила имеют вид:
rule NByN
replace [number]
1
by
2
end rule
Основные отличия от функций в других языках:
1. Всегда есть неявный параметр — обрабатываемый участок дерева (scope). Его тип указан сразу после replace , затем идет образец для сопоставления.
2. Возвращаемое значение должно быть того же типа что указано после replace. Это гарантирует корректность всего дерева на каждом этапе преобразования.
3. Правило всегда возвращает какое-то значение. Т.е. если сопоставление с образцом не было удачным, не происходит ошибки времени исполнения (как в большинстве ФЯ), а возвращается неизмененный участок дерева. Если же сопоставление произошло, то возращается новая структура.
4. Правило применяется не только к дереву верхнего уровня, но и осуществляет обход всей его структуры (слева-направо,сверху вниз). Это позволяет писать простые правила, каждое из которых делает свою часть работы в тех местах где нужно. Правило применяется и к результату своей работы, что в принципе может привести к зацикливанию.
Cамоприменение можно отключить, поставив сразу после replace значок $ .
Кроме правил есть еще обычные функции.
function NByN
replace [number]
1
by
2
end function
Функции не делают полный обход дерева (как правила) но могут осуществлять поиск (для этого после replace нужно поставить *). Т.е. дерево будет обходиться до тех пор, пока не будет найден узел, подходящий под образец.
Работа программы начинается с правила или функции с именем main.
По удобству могу сказать, что язык немного отстал в развитии, не хватает возможностей которые уже давно стандартны в других языках.
Также по началу сбивает с толку работа со списками. Для их представления неявно используются S-выражения, но было бы гораздо естественнее использовать R-выражения, как в Рефале.
Тогда кроме разрешенного паттерна
replace [repeat number]
N [number] R [repeat number]
by
1 R
Можно бы было использовать и
replace [repeat number]
R [repeat number] N [number]
by
R 1
Сейчас же для добавления к концу списка приходится заводить переменную и вызывать функцию.
Но несмотря на все эти недочеты, для своих задач язык очень подходящий. Кода приходится писать несколько больше, но напрягаешся при этом меньше. Все части программы изолированы друг от друга и это позволяет лучше сосредотачиваться на конкретных задачах.
Например мне очень понравилось, что форматирование кода (отступы и переносы строки) задается при описании грамматики. Это позволяет совершенно не задумываться об этом при формировании выходных структур — вся работа по форматированию будет сделана автоматически при выводе результата.
Конечно, есть куча программ и библиотек, решающих те же задачи, что и TXL, но здесь они удачно объединены в один инструмент.
Язык использовался в реальных крупных проектах по анализу исходного кода, переносу кода между платформами, оптимизации и др. В ходе работы с языком наработаны интересные подходы к решению реальных задач (объединение грамматик, аннотирование кода и др.)
Некоторую информацию об этом можно найти в документах, выложенных на сайте.
Язык развивается, недавно была выложена экспериментальная версия, имеющая множество
расширений. Среди них вложенные правила, возможность передавать правила через параметры и др.
Вся документация, форум, примеры и реализации для нескольких платформ доступны с сайта
www.txl.ca.
--
Mikl
Здравствуйте, Mikl Kurkov, Вы писали:
А свои мысли по этому пводу у тебя есть? Во второй половине этого года и в следующем я хотел бы прикрутить к R#-у некий язык (или что-то иное) трасформации. И меня интересуют любые мысли по этому поводу.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Здравствуйте, Gaperton, Вы писали:
G>Здравствуйте, vdimas, Вы писали:
V>>Здравствуйте, VladD2, Вы писали:
VD>>>Здравствуйте, AndrewVK, Вы писали:
AVK>>>>Итак — требуется придумать язык, заточенный под кодогенерацию (не модификацию!) на современных мейнстрим языках —
VD>>>А я вот с удовольствием послушал бы идеи о языке для модификации.
V>>Пролог
G>Реши на нем эту задачкуАвтор: AndrewVK
Дата: 13.07.05
.
Автор позже оговорился — что входной формат не важен, и это естественно, т.к. входной формат мы разрабатываем вместе с системой.
Здравствуйте, vdimas, Вы писали:
V>Автор позже оговорился — что входной формат не важен, и это естественно, т.к. входной формат мы разрабатываем вместе с системой.
Да я вобщем от своих слов не отказываюсь. Требования к входному формату я высказал — текстовый, декларативный, с декларативным описанием синтаксической структуры.
... << RSDN@Home 1.2.0 alpha rev. 585>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Да я вобщем от своих слов не отказываюсь. Требования к входному формату я высказал — текстовый, декларативный, с декларативным описанием синтаксической структуры.
EBNF?
![](/Forum/Images/biggrin.gif)
... << RSDN@Home 1.2.0 alpha rev. 578>>