Здравствуйте, VladD2, Вы писали:
AVK>>Так наличие дерева разбора не является прерогативой компилятора.
VD>Это 90% компилятора.
Из курса по построению компиляторов в институте я вынес что это примерно 15-20% Повторюсь — семантический анализатор это очень сложно.
VD>Имея полноценный разбор говорить о полумерах вроде препроцессора просто смешно.
Мне нет. Самопальный язык мне не нужен, а от интеллектуального кодогенератора я не отказался бы.
Здравствуйте, Igor Trofimov, Вы писали:
ВВ>>Ё#
iT>Нда.. помните про кнутовский "TEX", где E полагается пониже писать? ) iT>Вот сделать также Ё#, и # — как показатель степени...
iT>Вообще много можно нафантазировать про этого неубитого (и даже никем ни разу не виденного) медведя... И как его назвать... И как его продавать...
Да меня вот все мучит возможность скорого вымирания этой буквы в русском языке. Надо же сохранить ее для грядущих поколений..
А потом, и звучит красиво..
... << RSDN@Home 1.1.2 beta 1 >>
Re[4]: А не залудить ли нам свой язык для дотнета?
Здравствуйте, Ведмедь, Вы писали:
VD>>Мне кажется тут нужна все же команда, т.е. несколько увлеченных людей жаждущих извучать и творить. Можно попробовать создать "RSDN Research". И набрать в него членов.
В>Я б в ресёч пошелЮ пусть меня запишут В>На самом деле если будет время, то я с удовольствием
Ладно пойду пробивать открытие инициативы RSDN Research!
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: А не залудить ли нам свой язык для дотнета?
Здравствуйте, Ведмедь, Вы писали:
В>[PropertyAccessor("MyProperty")] В>int myVariable; В>И что бы если нет свойства MyProperty оно автоматически при компиляции появлялось
Мне кажется лучше плесать от свойства:
[Property("_myPropertyVarName", Accessor.GetSet)]
int MyVariable;
Тогда код будет формально совместим с Шарпом и будет поддерживаться студией.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>По сравнению с джеем AVK>Плюсы AVK>1) Заметно более внятный синтаксис метаязыка AVK>2) Значительно больше вещей описывается декларативно. Например построение синтаксического дерева можно осуществить без написания вставок на целевом языке. AVK>3) Результат генерации — классический синтаксический анализатор, осуществляющий разбор методом рекурсивного спуска. Отлаживать такой код довольно просто. AVK>4) Есть готовый кодогенератор и рантайм для шарпа.
Здорово. Но он ведь LL, т.е. леворекурсивный. Это не приведет к тому, что краматику придется описывать на птичьем языке?
И вообще, я как то с ходу не въехал как том у них и что.
Да и Яву надо было ставить. А влом же.
AVK>Минусы AVK>1) Непонятная задержка при самом первом вызове лексера. С причинами не разбирался.
Видимо парсер/лексер строют динамически. А это же конечные автоматы. Их считать надо. Хотя Jey гад все шустро делает.
AVK>2) Какой то бардак в шарповском рантайме с case sensitive лексера. При case sensitive = false все равно почему то чувствителен к регистру.
Ну, на это можно и плюнуть. К тмоу же если что поправим. Исходники то есть.
AVK>3) Джавовский стиль кода. Т.е. camel notation методов, вместо свойства методы getProperty()/setProperty().
Неприятно, но: а) можно пережить, б) можно отрефакторить.
AVK>4) Непонятно насколько соответствует готовая грамматика для шарпа стандарту.
Совсем несоответсвет. Я ее только 10 минут поглядел и нашел 5 не соответсвий. Но это вопрос решаемый (если с ним с самим разобраться).
AVK> Слова "Grammar file for cSharp language which supports most part of the cSharp language spec." настораживают. Если most значит не полностью, если не полностью то почему?
Халтура. Полноценный парсер сделать сложнее. Они сделали упрощенный вариант. Т.е. процентов 70% файлов он съест и ладно. Но простоту отладки и возможности парсера я бы поставил выше этого. К тому же из полностью готовых граматик есть только Моновская для Джея. А она: а) ГНУ-тая, и б) кривоватая (компилирует то на что МС ругается и кое чего нет).
AVK>5) Рантайм почему то не вызывает никаких событий, хотя сами события наличествуют.
Этого я вообще не понял.
Кстати, ты его запустил? У меня что-то с нахрапу не вышло.
AVK>Вывод: вобщем то даже предпочтительнее джея, при условии доведения до ума рантайма и, возможно, кодогенератора.
С Джеем самая большая проблема — это отладка. Она у LALR-парсеров в принципе тяжелая, а у джея еще и средств специальных нет.
К тому же у джея есть еще одна гадость которая для парсинга Шарпа очень неприятна.
Шарп имеет контекстные ключевые слова. Их не много, но это проблема. Первая же проблема возникает при парсинге глобальных атрибутов. Дело в том, что граматика файла в Шарпе выглядит так:
Т.е. Глобальные атрибуты отличаются от обычных только тем что в них обязательно есть attribute-target равный assembly или module. Но assembly и module не являются ключевыми словами! И LALR-парсер не может выделить глобальные атрибуты. Это приводит к дичайшим извратам. Так моновский парсвер вообще плюет на это и реализует не верную граматику. В Моно можно скомпилировать код в котором глобальный атрибут описан у метода или вообще где угодно.
Похожие проблемы (но уже не столь тяжелые) появляются с get/set в свойствах и add/remove в событиях.
Вот интересно этот самый ANTLR позволяет разруливать такие вещи? Ведь при методе рекурсивного спуска и возможности откатов такие вещи должны разруливаться.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здорово. Но он ведь LL, т.е. леворекурсивный.
Ты чего — рекурсия правая, разбор используется левый.
Иными словами идею LL(k) — грамматики можно объяснить так: если имеется уже разобранная часть цепочки, то на основании этого и еще нескольких неразобранных символов мы можем сделать вывод о том, какое правило неоюходимо применить. Таким образом грамматика посуществу не зависит (не считая k последующих символов) от того, что выводится из незаконченной части цепочки. В терминах деревьев этот процесс выглядит следующим образом: дерево вывода цепочки строится начиная с корня и детерминировано сверху вниз.
VD>Это не приведет к тому, что краматику придется описывать на птичьем языке?
Наоборот — файлы грамматик вполне внятны и выглядят как код на объектном языке, а не как куча жутких знаков в формате яка и почти не используются включения кода. Например язык типа SQL вобще описывается чистой грамматикой, при полном отсутствии в описании грамматик кода на шарпе, а на яке даже выделение многострочных комментариев без включения кода не обходится. Ну вобщем скачай грамматики и погляди — кусков кода и жутких псевдосимволов с номерами параметров там нет .
VD>И вообще, я как то с ходу не въехал как том у них и что.
Стандартное рекурсивное описание грамматик, похожее на то что используется в читабельной документации по языкам. Сам парсер представляет собой реализацию классического рекурсивного спуска.
VD>Да и Яву надо было ставить. А влом же.
Да чего там ее ставить — запустил инсталлер и нажал ОК. Рантайм поставить не сложно, если он у тебя уже не стоит . Набери java в консоли — что будет?
AVK>>Минусы AVK>>1) Непонятная задержка при самом первом вызове лексера. С причинами не разбирался.
VD>Видимо парсер/лексер строют динамически.
Нет. Все генерится кодогенератором. Судя по всему виноваты их движки для регексов — в статических свойствах по требованию создаются какие то битовые массивы, которые они используют для вычисления регексов.
VD> А это же конечные автоматы.
В LL грамматиках сам парсер не конечный автомат, а рекурсивный алгоритм. Т.е. в итоге конечно автомат, как и любая программа, но состояние хранится в стеке вызовов.
AVK>>2) Какой то бардак в шарповском рантайме с case sensitive лексера. При case sensitive = false все равно почему то чувствителен к регистру.
VD>Ну, на это можно и плюнуть. К тмоу же если что поправим. Исходники то есть.
Я нашел багу. Эти уродцы при создании хештаблицы с литералами HashCodeProvider нечувствительный указали, а Comparer нет. Править надо CSharpCodeGenerator.java, 1245 строка. Но тут уже нужен jdk чтобы потом скомпилять.
Вобще поглядел я на этот кодогенератор — по сравнению с тем что я приводил в своей статье детский сад. Класс 4500 строк размером и генерит код прямо прошитыми в код вызовами метода println.
AVK>>3) Джавовский стиль кода. Т.е. camel notation методов, вместо свойства методы getProperty()/setProperty().
VD>Неприятно, но: а) можно пережить, б) можно отрефакторить.
Да там похоже генератор не рефакторить, а переписыывать надо . Ну и рантайм рефакторить.
VD> К тому же из полностью готовых граматик есть только Моновская для Джея. А она: а) ГНУ-тая, и б) кривоватая (компилирует то на что МС ругается и кое чего нет).
У ANTLR лицензия без каких либо ограничений.
AVK>>5) Рантайм почему то не вызывает никаких событий, хотя сами события наличествуют.
VD>Этого я вообще не понял.
Ну вот например есть событие EnterRule или Error, только оно нигде не вызывается.
VD>Кстати, ты его запустил? У меня что-то с нахрапу не вышло.
Да вроде без проблем. Примеров там навалом, в том числе и на шарпе.
AVK>>Вывод: вобщем то даже предпочтительнее джея, при условии доведения до ума рантайма и, возможно, кодогенератора.
VD>С Джеем самая большая проблема — это отладка. Она у LALR-парсеров в принципе тяжелая, а у джея еще и средств специальных нет.
Вот с отладкой у рекурсивных парсеров все замечательно. Всегда понятно что разбираешь, поскольку нет никаких невразумительных состояний. Они вот только в отличие от яков умеют только древовидные структуры парсить, но в данном случае это вроде как не критично.
VD>Шарп имеет контекстные ключевые слова.
Ну в том парсере, что есть например get/set в свойстве выделяется в дерево как идентификатор.
Как это можно сделать еще надо вникать, сразу не скажу.
VD>Вот интересно этот самый ANTLR позволяет разруливать такие вещи? Ведь при методе рекурсивного спуска и возможности откатов такие вещи должны разруливаться.
Ну значит и разруливаются. Специальных фичек вроде не заметил, но код то свой втыкать можно, а возможности макроподстановок там довольно богатые. В одном из примеров разбирается выражение из цифр и знаков операций и при парсинге это выражение сразу и вычисляется. Т.е. в итоге получается парсер, который из "1+3*4" выдает на выходе float равный 13. Еще там есть концепция т.н. TreeWalker, которые производят трансформацию исходного дерева в целевое по определенным правилам.
Здравствуйте, AndrewVK, Вы писали:
AVK>Из курса по построению компиляторов в институте я вынес что это примерно 15-20% Повторюсь — семантический анализатор это очень сложно.
Это может и было бы сложно если бы почти все небыло бы сделано в Emit-е. А семантический анализ ты явно преувеличиваешь.
AVK>Мне нет. Самопальный язык мне не нужен, а от интеллектуального кодогенератора я не отказался бы.
Непонимаю чем хуже имень полноценный язык? Кодогенераторы — это полумера. Шаблоны в С++ так популярны потому, что они не являются кодогенераторами, а порождают код прикодный к отладке. На макросах такого не сделаешь.
Ладно. В любом случае пасер нужен. Так что кое что общее у нас есть.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: А не залудить ли нам свой язык для дотнета?
Здравствуйте, Igor Trofimov, Вы писали:
ВВ>>Ё#
iT>Нда.. помните про кнутовский "TEX", где E полагается пониже писать? ) iT>Вот сделать также Ё#, и # — как показатель степени...
О! Идея!
С-куб (С2). Вот только жаль писать степень неудобно.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: А не залудить ли нам свой язык для дотнета?
Здравствуйте, VladD2, Вы писали:
AVK>>Мне нет. Самопальный язык мне не нужен, а от интеллектуального кодогенератора я не отказался бы.
VD>Непонимаю чем хуже имень полноценный язык?
Я уже доводы привел. Для меня они очень важны и ты меня пока не убедил в обратном.
VD> Кодогенераторы — это полумера.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, VladD2, Вы писали:
AVK>>>Так наличие дерева разбора не является прерогативой компилятора.
VD>>Это 90% компилятора.
AVK>Из курса по построению компиляторов в институте я вынес что это примерно 15-20% Повторюсь — семантический анализатор это очень сложно.
Полность согласен. Хоть и практического опыта в построении компиляторов не имею.
Do not fake yourself ;)
ICQ#: 198114726
Re[7]: А не залудить ли нам свой язык для дотнета?
B>Я тут вспомнил один примерчик. Скажем у нас есть пользовательский интерфейс, логика предикатов хорошо подходит для решения головоломок. Вот и дать ему головоломку оптимального расположения контролов на форме, так что бы нужное было под рукой и нужного размера, а не нужное где-то в сторонке.
Что-то сомнения гложут, что оно всё правильно уложит. Выйдет, наверное, что-то очень замечательное, но "нечеловеческое". OK слева, Apply сверху, кнопка Close (как одна из самых частых в использовании) — посредине и огромная.
... << RSDN@Home 1.1.0 stable >>
Re[8]: А не залудить ли нам свой язык для дотнета?
Здравствуйте, mihailik, Вы писали:
B>>Я тут вспомнил один примерчик. Скажем у нас есть пользовательский интерфейс, логика предикатов хорошо подходит для решения головоломок. Вот и дать ему головоломку оптимального расположения контролов на форме, так что бы нужное было под рукой и нужного размера, а не нужное где-то в сторонке.
M>Что-то сомнения гложут, что оно всё правильно уложит. Выйдет, наверное, что-то очень замечательное, но "нечеловеческое". OK слева, Apply сверху, кнопка Close (как одна из самых частых в использовании) — посредине и огромная.
О, это слишком глобально. Например, надо нарисовать диаграмму процессов, аккуратно расположить блоки и стрелочки, примечания. Выигрыш в том, что отпадает необходимость тыкаться мышкой и подгонять по пикселам. Просто кидаешь блок в какую-то часть диаграмы, а программа уже сама подбирает ей достойное место (в данной части рисунка) и при необходимости перегрупперует остальные элементы.
Re[9]: А не залудить ли нам свой язык для дотнета?
M>>Что-то сомнения гложут, что оно всё правильно уложит. Выйдет, наверное, что-то очень замечательное, но "нечеловеческое". OK слева, Apply сверху, кнопка Close (как одна из самых частых в использовании) — посредине и огромная.
B> О, это слишком глобально. Например, надо нарисовать диаграмму процессов, аккуратно расположить блоки и стрелочки, примечания.
А вот в такое применение очень верится. Правильно! Если программисты к людям по-доброму, то и люди в долгу не останутся.
Здравствуйте, AndrewVK, Вы писали:
AVK>Иными словами идею LL(k) — грамматики можно объяснить так: если имеется уже разобранная часть цепочки, то на основании этого и еще нескольких неразобранных символов мы можем сделать вывод о том, какое правило неоюходимо применить. Таким образом грамматика посуществу не зависит (не считая k последующих символов) от того, что выводится из незаконченной части цепочки. В терминах деревьев этот процесс выглядит следующим образом: дерево вывода цепочки строится начиная с корня и детерминировано сверху вниз. AVK>[/q]
Это хорошо. В яке мнея больше всего ломает именно то, что все как в функциональном языке... все задом на перед, как то...
AVK>а на яке даже выделение многострочных комментариев без включения кода не обходится.
Коментарии еще лексер удаляет. Так что таких проблем у яка нет.
AVK> Ну вобщем скачай грамматики и погляди — кусков кода и жутких псевдосимволов с номерами параметров там нет .
Давно скачал. И посмотрел. Что-то мне их граматика еще меньше чем яковская понятна. Возможно с непривычки. Но доки у них фиговые. Я прочел про граматику и мало чего понял. Только общие идеи.
Ты кстати там не нашел толкового туториала или еще чего что можно почитать?
AVK>Стандартное рекурсивное описание грамматик, похожее на то что используется в читабельной документации по языкам. Сам парсер представляет собой реализацию классического рекурсивного спуска.
Не очень то оно у них стандартное. Как раз спецификация Шарпа описана практичкски в терминах яка. Только нет "|" и "-" (которые в яке недопустимы).
AVK>Да чего там ее ставить — запустил инсталлер и нажал ОК. Рантайм поставить не сложно, если он у тебя уже не стоит .
Там 1.1 нужен, а у меня его нет. Надо лезть на Сан...
AVK>Набери java в консоли — что будет?
Y:\RSDN\2003-6\Collections>java
'java' is not recognized as an internal or external command,
operable program or batch file.
AVK>Нет. Все генерится кодогенератором. Судя по всему виноваты их движки для регексов — в статических свойствах по требованию создаются какие то битовые массивы, которые они используют для вычисления регексов.
Блин. Это и есть конечные автоматы.
AVK>В LL грамматиках сам парсер не конечный автомат, а рекурсивный алгоритм. Т.е. в итоге конечно автомат, как и любая программа, но состояние хранится в стеке вызовов.
Лексер — это 100% НКА/ДКА.
Да и без разницы стек не стек. Главное, что нужно строить таблицы переходов.
У мнея лексер вручную написан. Так что тормозить там нечему. Им случаем нельзя его скормить?
И я не понял, тормоза эти при парсинге или в момент генерации кода парсера?
Если при парсинге, то это фигово. Скорость важная вещь.
Джэй работает молниеносно.
AVK>Вобще поглядел я на этот кодогенератор — по сравнению с тем что я приводил в своей статье детский сад. Класс 4500 строк размером и генерит код прямо прошитыми в код вызовами метода println.
Да какая разница какой там кодогенератор? Главное насколько эффективный код он создает...
AVK>Да там похоже генератор не рефакторить, а переписыывать надо . Ну и рантайм рефакторить.
Только еще переписывать нехватает. Может тогда уж на яке? Или пусть так пашет. А рантайм отрефакторим. В Видби это пару часов займет.
AVK>У ANTLR лицензия без каких либо ограничений.
Это большой плюс. Но у джея тоже. Тут вопрос уже в граматике и готовом коде парсера. На них там нет случаем отдельных ограничений?
AVK>Ну вот например есть событие EnterRule или Error, только оно нигде не вызывается.
Козлы! Вещь однозначно нужная. Хотя наверно это можно и инлайном сделать, прямо в правиле.
AVK>Вот с отладкой у рекурсивных парсеров все замечательно. Всегда понятно что разбираешь, поскольку нет никаких невразумительных состояний. Они вот только в отличие от яков умеют только древовидные структуры парсить, но в данном случае это вроде как не критично.
Скорее всего не критично. Хотя у меня к LL-схеме почему-то сразу негативное отношение сложилось. Видимо потому, что для в книжках когда про LL-анализ пишут, все время говорят о проблемах и череззадовом синтаксисе.
AVK>Ну в том парсере, что есть например get/set в свойстве выделяется в дерево как идентификатор.
AVK>
Мля. Эдак каждый дурак умеет. Даже в Моно и то умнее сделали. Они при входе в тело свойства переключают режим лексера и тот начинает выдавать на get/set соотвествующие ключевые слова.
А вот с атрибутами задница. В Моно так просто на них забили. А я выверннулся, но грязно. Джэй выдает конфликт свертка/свертка. Однако парсит правильно. В общем, незнаю. Но вроде это последняя проблема.
AVK>Как это можно сделать еще надо вникать, сразу не скажу.
А дерево он какое строит? Этим процессом можно управлять?
VD>>Вот интересно этот самый ANTLR позволяет разруливать такие вещи? Ведь при методе рекурсивного спуска и возможности откатов такие вещи должны разруливаться.
AVK>Ну значит и разруливаются. Специальных фичек вроде не заметил, но код то свой втыкать можно, а возможности макроподстановок там довольно богатые.
Главный вопрос в чем. У нас есть некая конструкция:
[assembly : assembly(assembly ? assembly : assembly)]
и например:
[return : assembly(assembly ? assembly : assembly)]
Так вот парсер должен определить, что в одном месте (в начале первого тэга) assembly — это токен TokAssembly, а в другом, что это идертификатор. Ну, и первую секцию атрибутов он должен определить как глобальную-секцию-атрибутов, а вторую как просто секцию-атрибутов.
А иначе правильность граматики ридется разруливать семантически. Что криво и гемаройно.
AVK>В одном из примеров разбирается выражение из цифр и знаков операций и при парсинге это выражение сразу и вычисляется. Т.е. в итоге получается парсер, который из "1+3*4" выдает на выходе float равный 13.
Гы. Это стандартный пример яка. Его во всех учебниках суют. Это не то что на джее, это даже на самом первом яке можно было сделать.
AVK> Еще там есть концепция т.н. TreeWalker, которые производят трансформацию исходного дерева в целевое по определенным правилам.
Это очнь полезно.
В общем, нужно определяться.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.