Здравствуйте, Didro, Вы писали:
D>Насколько мне известно, определенными возможностями по изменению синтаксиса обладают почти все языки (Lisp, Nemerle, C++, Prolog), есть и инструменты типа MPS для Java, R# для C#, gump для Mozart-Oz. Но большинство из них (из тех, что известны мне) обладают определенными ограничениями. Так, например R# и Gump работают только в рамках грамматик базовых языков (C# и Mozart-Oz соответственно) и выйти за пределы этих грамматик не получится. А хотелось бы. Лично мне это нужно в чисто исследовательских целях. Не знаю, будет ли практическая ценность от такого инструмента, так что можно рассматривать это просто как интересную задачу из computer science.
Вообще, все, чего вам хочется — не проблема. Систем изменения синтаксиса языков — несть числа: ASF-SDF2 и Stratego, TXL, Strafunski, в некотором роде ANTLR, и любимый мной XTC-Rats!. Проблемой остается С++, зато c С, Java и другими языками, для которых реально написать парсер, можно делать все, что угодно
? Собственно имя грамматику языка мы всегда можем её изменить -> сгенерировать парсер -> получить новую грамматику. Хотелось бы как-нибудь автоматизировать этот процесс или найти другое(принципиально) решение.
Расширяемый парсер — это парсер который допускает хотя-бы композицию (union) грамматик. LL, LR и LALR не такие, но есть GLR(SDF2 от ASF и Stratego) и PEG(Rats!), который поддерживает еще и пересечение и дополнение. Т.е. при наличии грамматики языка, мы просто дописываем грамматику расширений и потом втыкаем ее в старую грамматику. В последней версии XTC парсер Java 1.5 реализован как 5 дополнительных модулей к парсеру Java 1.4, общим весом 392 строки с комментариями.
Здравствуйте, Didro, Вы писали:
D>Есть ли примеры языков или инструментов, которые позволяют также легко обращаться с синтаксисом подопытного языка как Форт? Форту хорошо, у него даже парсера нет как такого, ибо максимальная единица синтаксиса — слово. Т.е. нет грамматики языка Форт (тем более что это не совсем язык), по которой нужно генерировать парсер и т.д.
D>Насколько мне известно, определенными возможностями по изменению синтаксиса обладают почти все языки (Lisp, Nemerle, C++, Prolog), есть и инструменты типа MPS для Java, R# для C#, gump для Mozart-Oz. Но большинство из них (из тех, что известны мне) обладают определенными ограничениями.
Lisp и Forth — языки без грамматики, или — со свободной грамматикой. Их "синтаксис" можно менять без ограничений. Также рядом совершенно справедливо упомянули tcl — замечательный метаязык, на котором, например, можно делать "исполняемые конфигурационные файлы" — конфиг, который представляет собой на самом деле скрипт, который можно запустить.
D>Т.е. в общем случае, если говорить о технологическом, а не о промышленном решении, нужен расширяемый парсер. Не понятно только, что считать расширяемым парсером
? Собственно имя грамматику языка мы всегда можем её изменить -> сгенерировать парсер -> получить новую грамматику. Хотелось бы как-нибудь автоматизировать этот процесс или найти другое(принципиально) решение.
"Расширяемый парсер" — это макропроцессор camlp4 для OCaml. Он позволяет описывать отдельно грамматические расширения, и динамически их подключать. camlp4 — это не генератор парсеров, это расширение языка.
В расширении вашей грамматики, которое оформляется как независимый исходный модуль на camlp4, вы можете точно указать, как именно вы модифицируете базовую грамматику — что-то удалить, что-то добавить. Эта связка специально предназначена для экспериментов с языкоми программирования. На данный момент, это единственный "расширяемый парсер", и tool of choice для прототипирования компиляторов.
Здравствуйте, Didro, Вы писали:
D>Есть ли примеры языков или инструментов, которые позволяют также легко обращаться с синтаксисом подопытного языка как Форт?
Если оставаться в рамках текстового представления программы — то это XL (http://mozart-dev.sourceforge.net/)
D>или найти другое(принципиально) решение.
Принципиально другим будет отказ от текста как базового представления программы — тогда "синтаксиса" не будет
по определению, и проблем с ним не будет. Вот так, например http://www.symade.org/
(или статья на русском http://www.symade.org/SOP_and_SymADE.doc)
Более работоспособная версия той-же идеи — http://www.jetbrains.com/mps/, но реализация проприетарная, так же как и где-то готовящаяся (совершенно по партизански) реализация Intentional Programming.
Здравствуйте, Didro, Вы писали:
D>Есть ли примеры языков или инструментов, которые позволяют также легко обращаться с синтаксисом подопытного языка как Форт? Форту хорошо, у него даже парсера нет как такого, ибо максимальная единица синтаксиса — слово. Т.е. нет грамматики языка Форт (тем более что это не совсем язык), по которой нужно генерировать парсер и т.д.
D>Есть идеи?
что-то похожее можно в tcl сделать.
не так хорошо как в форте правда.
Есть ли примеры языков или инструментов, которые позволяют также легко обращаться с синтаксисом подопытного языка как Форт? Форту хорошо, у него даже парсера нет как такого, ибо максимальная единица синтаксиса — слово. Т.е. нет грамматики языка Форт (тем более что это не совсем язык), по которой нужно генерировать парсер и т.д.
Насколько мне известно, определенными возможностями по изменению синтаксиса обладают почти все языки (Lisp, Nemerle, C++, Prolog), есть и инструменты типа MPS для Java, R# для C#, gump для Mozart-Oz. Но большинство из них (из тех, что известны мне) обладают определенными ограничениями. Так, например R# и Gump работают только в рамках грамматик базовых языков (C# и Mozart-Oz соответственно) и выйти за пределы этих грамматик не получится. А хотелось бы. Лично мне это нужно в чисто исследовательских целях. Не знаю, будет ли практическая ценность от такого инструмента, так что можно рассматривать это просто как интересную задачу из computer science.
Т.е. в общем случае, если говорить о технологическом, а не о промышленном решении, нужен расширяемый парсер. Не понятно только, что считать расширяемым парсером
? Собственно имя грамматику языка мы всегда можем её изменить -> сгенерировать парсер -> получить новую грамматику. Хотелось бы как-нибудь автоматизировать этот процесс или найти другое(принципиально) решение.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>единственный Strafunski, которого находит гугл — это библиотека generic программирования
Это он самый.
A Strafunski Application Letter
...Abstract. Strafunski is a Haskell-centred software bundle for implementing
language processing components — most notably program analyses and transformations.
Typical application areas include program optimisation, refactoring,
software metrics, software re- and reverse engineering.
Strafunski started out as generic programming library complemented by generative
tool support to address the concern of generic traversal over typed representations
of parse trees in a scalable manner. Meanwhile, Strafunski also encompasses
means of integrating external components such as parsers, pretty printers,
and graph visualisation tools.
...