Регистрация     
Последние записи в блогах
Типы-псевдонимы в моём компиляторе? Почему бы и нет...
Заболотнев Юрий опубликовал 18.03.2010, 9:17 в блог 'Мой блог'

Продолжаю работу над своим компилятором. Сейчас мой компилятор понимает русскоязычные ключевые слова. Но как же быть с названиями базовых классов и их членов? Вот пример: есть такой метод String.Format() . Вызов этого метода в моём языке сейчас будет такой:

Перем ч Как Строка = "10"
Сообщить(String.Format("Было {0} негретят", ч))

Не очень красиво, правда? Переключаться на английский, потом обратно.

Поэтому я решил добавить в свой язык возможность создания псевдонимов (или алиасов) типов. Причем, не только типов, а ещё их членов. Всё-таки умные люди придумали .NET, ведь в нём есть такая отличная вещь, как CustomAttributes. Именно благодаря этим атрибутам реализованы такие вещи, как модули в VB и методы-расширения в .NET 3.5. И именно при помощи этих атрибутов я реализую механизм псевдонимов в своём компиляторе. Выглядеть это будет примерно так: в специально созданной библиотечке я создам новый интерфейс. Вообще в качестве классов-псевдонимов подходят именно интерфейсы. Этот интерфейс я назову, например, «Строка». Потом помечу его специальным атрибутом, назову его «TypeAlias» , а параметром атрибута будет ссылка на тип System.String.

[TypeAlias(typeof(System.String))]
public interface Строка

Далее в теле интерфейса я опишу все методы, которые я хочу локализовать. Точнее не методы, а все перегрузки этих методов. Получится примерно так:

[MemberAlias("Format")]
string Формат(string Формат, Object Арг0);
[MemberAlias("Format")]
string Формат(string Формат, Object Арг0, Object Арг1);
[MemberAlias("Format")]
string Формат(string Формат, params Object Арг);

Потом всё это компилирую и получившуюся сборку подключаю к моему компилятору. А дальше всё просто. Все ссылки на тип «Строка» мой резольвер автоматически заменит ссылкой на тип «String». Также все ссылки на метод «Формат» класса «Строка» будут заменены на метод «String.Format» с соответствующей сигнатурой. Для выполнения этой подмены у компилятора будут все необходимые данные.

Вот только какие-то языковые конструкции, которые дали бы возможность создавать псевдонимы в пользовательском коде, я всё же пока реализовывать не буду. Просто будет перечень локализованных базовых классов.




Просмотров: 18 |  Комментариев: 0 | 
 | Голосов: 1 | 
Заболотнев Юрий опубликовал 07.02.2010, 13:45 в блог 'Мой блог'

yurik-z нашёл друга, его зовут Prof




Просмотров: 12 |  Комментариев: 0 | 
 | Голосов: 0 | 
Я доделал компилятор!
Заболотнев Юрий опубликовал 05.02.2010, 21:25 в блог 'Мой блог'

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

Приглашаю в мой основной блог на yurik-z.ya.ru, скачать пример можно здесь. Комментарии приветствуются!




Просмотров: 70 |  Комментариев: 2 | 
 | Голосов: 1 | 
Компилятор JavaScript и универсальный синтаксический парсер
Заболотнев Юрий опубликовал 05.06.2009, 13:55 в блог 'Мой блог'

  Недавно написал одну очень интересную утилиту. Вообще-то идея создания такой утилиты мне пришла в голову ещё в начале года, но только сейчас появилось время её сделать. Идея такая: большинство языков программирования имеют ряд схожих свойств. Например, вложенность языковых конструкций. При этом все языки настолько разные, что писать парсер отдельно взятого языка очень тяжело, т.к. нет универсального парсера. Вот его я и решил написать. Для решения данной задачи я придумал специальный язык описания синтаксиса (на основе XML) – язык описания схемы синтаксиса. На этом языке описываются все тонкости синтаксиса нужного языка. Далее файл с кодом и схемой синтаксиса передается в универсальный компилятор, на выходе мы получаем объектный граф данного файла. Это очень напоминает работу обычного XML парсера, за одним исключением: анализировать можно любые языки, надо просто написать схему. Далее полученный граф очень легко анализировать. Достаточно просто перебирать ветки графа и считывать значения свойств.

  К чему я это всё: в результате у меня получилось даже несколько утилит. Одна из них: так называемый компилятор JavaScript (условно конечно). Суть такая: хотим, чтоб наш JavaScript загружался клиенту как можно быстрее. Для этого пишем схему языка JavaScript (у меня кстати получился довольно компактный. 311 строк XML-а – это с комментариями), далее передаем эту схему и сам файл с расширением .js в универсальный парсер. Получаем объектную модель, описывающую данный файл. Пробегаемся циклом по всем веткам, заменяем длинные названия типа «document_onload» на «f123», и «objMainWindowFrame» на «f321». Кстати этот алгоритм получился очень похож на анализ обычного XMLDocument. Затем генерируем повторно текст на языке JavaScript без комментариев и лишних пробелов. В результате наш .js сжимается примерно в 2 раза (конечно, всё зависит от самого файла).Пробовал на скрипте календаря dlcalendar. Работает :-). Файл dlcalendar.js сжимается с 44кб до 29кб с полным сохранением функционала. А ещё, при помощь универсального парсера и пространства имен System.CodeDom в .NET у меня получилось написать компилятор языка с русскоязычным синтаксисом. Но об этом напишу позже, когда можно будет компилировать программки посерьезнее, чем "Привет Мир!"




Просмотров: 12 |  Комментариев: 0 | 
 | Голосов: 0 | 
yurik-z
Заболотнев Юрий

Посетили сайт:
9392

Дата регистрации:
29 сентября 2008 г. 21:06:42

Последний визит:
26 ноября 2009 г. 15:40:36

Семейное положение:
Не указано
Список блогов
Случайное фото
Пользователь не загрузил ни одного фото
Сейчас на сайте
Гости сайта
Партнеры сайта