Re[7]: Задачка: придумать язык
От: vdimas Россия  
Дата: 15.07.05 16:47
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Последний вариант от Gapteron можно переписать "близко к тексту" для кодогенератора на основе ASP.Net — движка.

Это, ИМХО, немного не то (вернее — совсем не то).

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

В то время как в том же Пролог достаточно будет просто добавить очередное правило.
Re[8]: Задачка: придумать язык
От: Gaperton http://gaperton.livejournal.com
Дата: 15.07.05 18:29
Оценка:
Здравствуйте, vdimas, Вы писали:

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


V>Последний вариант от Gapteron можно переписать "близко к тексту" для кодогенератора на основе ASP.Net — движка.


Да ну? Попробуй переписать на ASP.NET вот эти три строки — на самом деле все дело в них, а не в отдельной функции, генерирующей текст для одного узла.

parsetree( [ H | T ] ) -> parsetree( H ) ++ parsetree( T );
parsetree( [] ) -> "";
parsetree( Node ) -> Node.tag( Node ).


V>Это, ИМХО, немного не то (вернее — совсем не то).


V>Я вижу основную идею в том, чтобы просто иметь правила трансформации одних структур в другие.

Любая программа на ФЯ, обрабатывающая дерево, является ни чем другим как декларативным описанием этих правил трансформации. Код я привел на измененном Erlang, который — ФЯ.
Re[3]: Задачка: придумать язык
От: Gaperton http://gaperton.livejournal.com
Дата: 15.07.05 18:31
Оценка: +1
Здравствуйте, vdimas, Вы писали:

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


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


AVK>>>Итак — требуется придумать язык, заточенный под кодогенерацию (не модификацию!) на современных мейнстрим языках —


VD>>А я вот с удовольствием послушал бы идеи о языке для модификации.


V>Пролог


Реши на нем эту задачку
Автор: AndrewVK
Дата: 13.07.05
.
Re[2]: Задачка: придумать язык
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.07.05 18:44
Оценка:
Здравствуйте, vdimas, Вы писали:

V>ИМХО, из популярных Пролог вполне подходит.


Пример?

V>Разработай форматы входных данных вместе с кодогенератором (по мере скурпулезного уточнения требований к формату)


Мне не нужен один едиснтвенный формат, мне нужна возможность работать с тем форматом, который наиболее удобен в каждом конкретном случае.

V>Попутный вопрос — исходные данные для кодогенерации хранятся в некоем репозитории? Какой к нему интерфейс?


Неважно. Пусть это будет текстовый файл.

AVK>>3) Возможность работы с несколькими источниками входных данных.


V>В смыле — с различными форматами?


В смысле одновременно с несколькими источниками. Например с несколькими файлами.
... << RSDN@Home 1.2.0 alpha rev. 572>>
AVK Blog
Re: Задачка: придумать язык
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.07.05 18:44
Оценка:
Вспомнил одну штуку, которую где то видел. Итак, задачка из топика про лисп.
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>>
AVK Blog
Re[4]: Задачка: придумать язык
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.07.05 19:15
Оценка:
Здравствуйте, Mikl Kurkov, Вы писали:

MK>Если объединить грамматики исходного и целевого языка, то генерация станет трансформацией.

MK>Кроме того не обязательно сразу расписывать полную грамматику, можно начать с упрощенной, постепенно усложняя по мере необходимости. А строгая проверка типов может сильно облегчить этот процесс. Кстати язык имеет встроенные стредства такого постепенного уточнения грамматик.

А ты им сам пользовался? Меня вот интересует их язык трасформаций. Насколько он удобен?
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Задачка: придумать язык
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.07.05 19:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вспомнил одну штуку, которую где то видел. Итак, задачка из топика про лисп...

И? Что ты хотел этим сказать?
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Задачка: придумать язык
От: Mikl Kurkov Россия  
Дата: 20.07.05 12:04
Оценка: 72 (2)
Здравствуйте, 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
Re[6]: Задачка: придумать язык
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.07.05 13:40
Оценка:
Здравствуйте, Mikl Kurkov, Вы писали:

А свои мысли по этому пводу у тебя есть? Во второй половине этого года и в следующем я хотел бы прикрутить к R#-у некий язык (или что-то иное) трасформации. И меня интересуют любые мысли по этому поводу.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Задачка: придумать язык
От: vdimas Россия  
Дата: 21.07.05 18:11
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


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


AVK>>>>Итак — требуется придумать язык, заточенный под кодогенерацию (не модификацию!) на современных мейнстрим языках —


VD>>>А я вот с удовольствием послушал бы идеи о языке для модификации.


V>>Пролог


G>Реши на нем эту задачку
Автор: AndrewVK
Дата: 13.07.05
.


Автор позже оговорился — что входной формат не важен, и это естественно, т.к. входной формат мы разрабатываем вместе с системой.
Re[5]: Задачка: придумать язык
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 22.07.05 19:48
Оценка:
Здравствуйте, vdimas, Вы писали:

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


Да я вобщем от своих слов не отказываюсь. Требования к входному формату я высказал — текстовый, декларативный, с декларативным описанием синтаксической структуры.
... << RSDN@Home 1.2.0 alpha rev. 585>>
AVK Blog
Re[6]: Задачка: придумать язык
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.07.05 00:09
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Да я вобщем от своих слов не отказываюсь. Требования к входному формату я высказал — текстовый, декларативный, с декларативным описанием синтаксической структуры.


EBNF?
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.