[ XTX ] Самописный мини-язык

Блог о компьютерах и еде :)

Модератор: ANDLL

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

[ XTX ] Самописный мини-язык

Сообщение ANDLL » 25.01.2009 (Вс) 19:51

Вам когда-нибудь приходило в голову написать свой язык программирования? Не какой-то там VB только с ассемблерными вставками, или perl но компилируемый, а просто свой язык для своей цели?
Когда мне потребовалось унифицировать один из модулей некоей программы, мне пришло в голову написать свой ЯП. Глупо и не разумно(разумнее например поискать решение в гугле), зато интересно.
Итак,

XTX – специализированный декларативный язык программирования, предназначенный для обработки текстов.
Специализированный – значит, не предполагается, что на нем нужно писать программу для смены обоев или звонилку-напоминалку. Этот язык предназначен для написания программы, работающих по принципу text -> text. Его можно назвать прямым аналогом XSLT, только XSLT преобразует xml -> xml.
Приведем описание ключевых аспектов языка

Типизация

XTX – язык со строгой и неявной типизацией. Это означает, что каждая ячейка в языке всегда имеет строгий тип данных, но, тем не менее типы не проверяются на этапе разбора, а проблемы преобразования выявляются только в run-time.

Парадигма

Как уже отмечалось выше, язык декларативный, с элементами функционального(впрочем оные элементы появятся позже)

Синтаксис

Не хотелось бы тратить время на написание самого парсера для языка. Это связано не с ленью – просто тема настолько изжевана, что тратить на это время еще раз просто не имеет смысла. Поэтому синтаксис языка(как и XSLT), полностью наследуется от XML. Что-то мне подсказывает, что использовать для синтаксиса функционального языка программирования XML – весьма здравая идея, ибо XML очень удобен для кодирования деревьев.

Среда выполнения

XTX – транслируемый язык программирования. Транслятор языка написан на C#.

Масштаб

Цель создания этого языка – не порабощения мира или там создание мега стандарта. Если кому-то понравится применять язык в той или иной области – круто. Если нет, не страшно, ибо писать такие вещи само по себе занятно.

Расширяемость

Написание языка также подразумевает создание API для написания его расширений. Расширения языка могут писаться на любом языке программирования поддерживающем платформу .NET.

Совместимость с Mono

Транслятор языка полностью совместим с mono 1.9 и выше. Таким образом программы написанные на XTX могут выполняться на многих ОС из семейства unix. Ну не то что бы этого было очень сложно добиться , но тем не менее, это принципиальный момент.

Два примера программы

Дабы было примерно понятно, о чем идет речь, приведем два листинга программ
1.
Код: Выделить всё
<!-- Программа загружает станицу http://ya.ru и удаляет все символы <\>(больше\меньше\слэш) -->
<concat>
  <replace use_regex="true">
    <what>
      <download>
        <text>http://ya.ru</text>
      </download>
    </what>
    <from>
      <t>[&gt;&lt;/]</t>
    </from>
    <to>
      <t></t>
    </to>
  </replace>
</concat>

2.
Код: Выделить всё
<!-- Загружает страницу с cnews и отделяет текст новости(в виде html) от всего остального(шапки, рекламы и прочего)-->
<concat>
  <group index = "1">
    <first>
      <regex reg="&lt;/noindex&gt; ?&lt;/div&gt; ?&lt;/div&gt;(.+)&lt;/div&gt; ?&lt;noindex&gt; ?&lt;div class=&quot;NewsNoFloat&quot;&gt;">
        <shrink_whitespaces>
          <download>
            <text>http://corp.cnews.ru/news/top/index.shtml?2009/01/16/334702</text>
          </download>
        </shrink_whitespaces>
      </regex>
    </first>
  </group>
</concat>
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: [ XTX ] Самописный мини-язык

Сообщение ANDLL » 25.01.2009 (Вс) 19:52

Внешний API

API траснлятора представлен классом XTX.parser.Engine.
Публичные методы класса:

public Engine(XmlNode node)

Принимает в качестве параметра узел – программу написанную на XTX

public string transform()

Выполняет программу на XTX и возвращает результат.

public string transform(string x)

Передает в программу строковый параметр x, и выполняет ее как и transform()

public void add_object_handleMap(object o)

Добавляет user-defined расширение.
Об этом чуть подробнее.
Каждый «тэг» языка – это функция с прототипом
Код: Выделить всё
public delegate object fun(XmlNode e);

Все функции хранятся в приватной мапе handleMap, которая сопоставляет имя тэга и функцию.
Код: Выделить всё
Dictionary<string, fun> handleMap

add_object_handleMap Добавляет в handleMap функции из объекта o, помеченные атрибутом RegisterAction
Функция должна обработать переданные ей узел и вернуть результат работы.
Например функция download выглядит так:
Код: Выделить всё
        [RegisterAction()]
        private string download(XmlNode e)
        {
            string url = cast<string>(handle(xmlFirstChild(e)));
            return (new WebClient()).DownloadString(url);
        }

Функция cast

Код: Выделить всё
T cast<T>(object o)

Функция cast служит для внутреннего приведения типов. Для преобразования типов внутри языка следует использовать только ее, а не оператор приведения C#. Хотя сейчас она мало отличается от обычного приведения в C#, в дальнейшем ее планируется расширить, добававив user-defined операторы приведения. Сейчас эта функция особенна только тем, что не позволяет приводить к string некоторые из объектных типов. Хотя метод ToString() есть у любого объекта .NET, по идеалогии языка не все типы можно привести к string. К примеру, нельзя привести к String MatchCollection, и функция cast бросает исключение при попытке такого преобразования типов.

Функция handle

Код: Выделить всё
object handle(XmlNode e)

Функция handle – «центральный диспетчер» в XTX, ее задача – выполнить подпрограмму содержащуюся в узле e, согласно карте handleMap.

Исходные коды проекта

Основные этапы создания проекта я буду описывать в этом блоге. Исходные коды в аттаче. Исходные коды распространяются по лицензии GPL.
Вложения
XTX.zip
(7.7 Кб) Скачиваний: 212
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: [ XTX ] Самописный мини-язык

Сообщение MIT » 25.01.2009 (Вс) 20:43

Занятно. Правда пока не могу уловить смысл задуманного (хотя, если это занятие не для цели а для души, то смысл и не важен), но выглядит интересно.
А как будет выглядеть конечный написанный продукт: будет ли он скомпилированный, или же останется XML-скриптом?

p.s.: порадовало название файла Pare.cs
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: [ XTX ] Самописный мини-язык

Сообщение ANDLL » 25.01.2009 (Вс) 20:52

Так и останется XML-скриптом.
порадовало название файла Pare.cs
опечатка, читать как pair
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: [ XTX ] Самописный мини-язык

Сообщение MIT » 25.01.2009 (Вс) 21:02

(Вопросы как конечного пользователя)
А как (и где) будет скрипт выполнятся, т.е. что нужно для его работы? Чего пользователь сможет добится пользуясь языком? Как им предпологается пользоваться?
Вариант: "XTX.exe ../script.ext [input.file] output.file"

Просто интересно, во что данная затея может вылится и практически приложится.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: [ XTX ] Самописный мини-язык

Сообщение ANDLL » 25.01.2009 (Вс) 21:17

Можно как xtx.exe ..... если требуется standalone запуск
Но скорее как часть какогото другого кода, то есть как
Код: Выделить всё
Engine engine = new Engine(...);
... = engine.transform();
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: [ XTX ] Самописный мини-язык

Сообщение MIT » 25.01.2009 (Вс) 21:29

То есть что-то типа написаной на .NET программы со скриптовыми макросами.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: [ XTX ] Самописный мини-язык

Сообщение ANDLL » 26.01.2009 (Пн) 0:45

Ну просто вызывать траснлятор не обязательно через запуск отдельного EXE, можно запустить программу на XTX прямо внутри существующего application domain...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


Вернуться в Великий гастроном andll

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList