LINUX.ORG.RU

как быстро создать свой ЯП?

 ,


3

2

Сабж. Есть идеи, хочу их попробовать. Если ли, скажем, какие-то тулкиты для эээ автоматизации этого? Ну, например, набор примитивов (структуры, списки, массивы ...), плюс какие-нить парсеры итд итп. Я не про yacc/bison+llvm, а про что-нить более высокоуровневое и лузер-френдли.

★★★★★
Ответ на: комментарий от pawnhearts

дело в том, что половина анонимусов драгонбук вместо букваря читала

Вообще-то эта книга входит в программу обучения на большинстве программерских специальностей, так что ничего удивительного.

anonymous
()
Ответ на: комментарий от Dark_SavanT

Там все хорошо, кроме слишком уж марсианской концепции нетекстового редактора.

anonymous
()

Сначала напиши интерпретатор языка на нем самом. Очень помогает. Можно выбрать любой.

Suntechnic ★★★★★
()
Ответ на: комментарий от Deleted

Это риторические вопросы, очевидно же что это сложно и мало кому нужно. То есть для проектов с сотнями человеко-лет какой-то рисерч, оптимизации, вся эта обвязка уже как-то встречается, но для языков которые в состоянии proof of concept и пишутся одним автором это как-то бессмысленно, вам не кажется? Хочется сделать как можно проще и быстрее

вообще спор ниачом. мало ли что хочется, вопрос, зачем так изгаляться?

одно дело, если бы ты привёл кучу пруфлинков типа : n% языков слеплено на коленке быстрее без AST чем m% c AST, при этом языки разрабатывались в k% раз быстрее без AST чем с ним.

на практике такого не наблюдаем. да, есть вроде бы где-то на горизонте Ometa из проекта FONC, в котором AST «как бы» нет. на самом деле, он там есть, только в смоллток-подобном виде, см. parsers running backwards и проч. вот в Ometa как раз и есть тот тезис, что в этом language workbench новые языки ad hoc разрабатывать должно быть проще.

да, есть ещё подход когда парсер пишется без лексера. тот же PEG, packrat или парсер-комбинаторы. c оптимизациями тут надо будет повозиться.

из минусов: не очень производительные подходы, и первый и второй — парсер получается не очень быстрый в первом случае, и не очень полезный во втором. одно дело, когда нужно слепить язык на коленке быстро, другое, когда этот парсер помногу раз в день запускается.

anonymous
()
Ответ на: комментарий от anonymous

поэтому как правило никто так и не делает.

anonymous
()
Ответ на: комментарий от anonymous

да, есть ещё подход когда парсер пишется без лексера. тот же PEG, packrat или парсер-комбинаторы. c оптимизациями тут надо будет повозиться.

А чем тебе PEG-то не угодил? Оптимизируется он весьма легко. Посмотри на тот же PEG в Nemerle, он шарпик парсит быстрее чем Mono.

Даже Packrat может быть быстрым, если кое какие оптимизации применить (мемоизация только высокоуровневых узлов, но не токенов, inlining).

Причем, PEG наиболее мощный из всех, позволяет описывать языки, которые никакой из автоматных алгоритмов никогда распарсить не сможет.

anonymous
()
Ответ на: комментарий от anonymous

А чем тебе PEG-то не угодил? Оптимизируется он весьма легко. Посмотри на тот же PEG в Nemerle, он шарпик парсит быстрее чем Mono.

есть сомнения в оптимальности скорости его работы, в сравнении с ANTLR, например. нужны дополнительные усилия, например как в Rats! или в packrat (черезчур, обычно достаточно меньшей цепочки наиболее употребимых правил).

то есть, если сравнить ANTLR vs. PEG, то первый всегда будет быстрее.

другой вопрос в том, что грамматику на PEG можно наколбасить за полчаса с тестами, а на ANTLR за пару часов (если с нуля), с тестами в gUnit и потом долго читать доку или книжку по ANTLR чтобы понять, как реализовать очередной семантический предикат.

если кое какие оптимизации применить

да, именно. где-то в рассылке PEG или Ometa был пример более-менее реального парсера, чего-то вроде Delphi. с бенчмарками по разным реализациям PEG.

Причем, PEG наиболее мощный из всех, позволяет описывать языки, которые никакой из автоматных алгоритмов никогда распарсить не сможет.

в случае с ANTLR это компенсируется возможностью втыкать свои синтаксические/семантические предикаты, которые ещё надо придумать, как написать.

anonymous
()
Ответ на: комментарий от anonymous

есть сомнения в оптимальности скорости его работы, в сравнении с ANTLR, например.

ANTRL - тупейший LL(n). Обогнать его - вообще напрягаться не надо.

нужны дополнительные усилия, например как в Rats! или в packrat (черезчур, обычно достаточно меньшей цепочки наиболее употребимых правил).

Посмотри на Nemerle PEG - там ни разу не packrat, там вообще Pratt.

то есть, если сравнить ANTLR vs. PEG, то первый всегда будет быстрее.

Чушь.

в случае с ANTLR это компенсируется возможностью втыкать свои синтаксические/семантические предикаты, которые ещё надо придумать, как написать.

Не компенсируется. Никогда ты не сделаешь на Antlr, например, динамически расширяемую грамматику (как в Katahdin или Fortress).

anonymous
()
Ответ на: комментарий от anonymous

то есть, если сравнить ANTLR vs. PEG, то первый всегда будет быстрее.

Чушь.

ну это я свои субъективные ощущения написал. а есть пример, более-менее нетривиального языка, когда по эквивалентной грамматике на PEG генерируется парсер, который работает значительно быстрее эквивалентного парсера на ANTLR?

anonymous
()
Ответ на: комментарий от anonymous

ну это я свои субъективные ощущения написал. а есть пример, более-менее нетривиального языка, когда по эквивалентной грамматике на PEG генерируется парсер, который работает значительно быстрее эквивалентного парсера на ANTLR?

Ну я же уже два раза сказал - Nemerle PEG, грамматика сишарпика (вроде бы, достаточно нетривиален).

anonymous
()
Ответ на: комментарий от anonymous

И, кстати, с каких пор скорость парсинга стала важным критерием? Находятся любители писать парсеры на PHP и Javascript даже, и ничего, живут как-то.

anonymous
()
Ответ на: комментарий от anonymous

Тупой вопрос, а antlr умеет делать ast в виде какого-нить json? А то я хотел из питона генерировать код, а под питон нормальных парсеров не нашёл. Перепробовал всё что было в гугле, мне не понравилось. Или под руби, я думаю я и руби осилю.

Старые antlr умели биндинги к питону, а вот antlr4 уже нет :(

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Питон - говняный язык для написания трансляторов. Очень говняный. И руби тоже полное говно. На языки без pattern matching даже не смотри.

anonymous
()
Ответ на: комментарий от anonymous

Паттерн матчинг нужен для парсера. А вот как только есть AST я не понимаю как паттерн матчинг может помочь.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Паттерн матчинг нужен для парсера.

Чё?!? Для парсера он как раз на хер не нужен.

А вот как только есть AST я не понимаю как паттерн матчинг может помочь.

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

Pattern matching необходим для того, чтобы описывать преобразования этого самого AST. Компилятор - это последовательность очень простых преобразований, от AST исходного языка и до целевого языка (который может быть и плоской последовательностью инструкций, и AST языка высокого уровня).

anonymous
()
Ответ на: комментарий от anonymous

Тебе же дали много хороших ссылок, почитай хотя бы по диагонали!

я уже неделю по диагонали читаю, кол-во вкладок сейчас 34 и продолжает множится...

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Тупой вопрос, а antlr умеет делать ast в виде какого-нить json?

он умеет отдавать ast в виде S-выражений простым вызовом AST.toStringTree(). получается немного некрасиво отформатированный дамп, который можно загрузить в REPL лиспа, посмотреть, что он ругается на нереализованные формы, реализовать макросами формы, и получить такой тоже интерпретатор/компилятор с небольшими усилиями.

а если делать например свой pretty printing, обходя дерево ручками можно нарисовать форматирование, печатать в JSON и т.п. что угодно

antlr3 питон поддерживал: target вообще поддерживаются такие: targets ещё

anonymous
()

Кстати, да, я задумался и понял что не знаю как парсить Питоно-подобные языки. То есть мне Питон вообще умеренно интересен, больше скрипта на 30 строчек на нем ниасиливаю.

Почитал прессу, исходники Питона, подумал и поосозновал. Там не очень все просто, у него из-за «скобочек» отступами не совсем контекстно-свободная грамматика, и чтоб ее сделать такой, в лексере делают псевдо-токены INDENT и DEDENT. Подумал еще, положил клавиатуру на коленку и набыдлокодил пример:

https://github.com/vmxdev/nap

Пример ничего особо полезного не делает, просто парсит и отбивает ошибки (иногда) если их находит.

Умеет парсить что-то типа такого:

class a(b):
    pass
    def __constructor__(int p1, float p2) returns string as:
        pass

class c(d, e, f):
    x = y
    z = 42
    def __constructor__(int p1, float p2) returns string as:
        pass
    class subclass():
        d = 88
        def subclass_func() returns void as:
            pass

def g() returns int as:
  pass

Ну, я там сделал три «действия» (Semantic Actions), они просто выводят названия функций и классов, когда парсер их, э-э, парсит. Хотя, конечно, в этих действиях нужно генерировать AST :) но я все по-простому написал, и натурально на коленке, вообще без никаких затей. Если бы не INDENT/DEDENT, код лексера был бы раза в два короче. А если на OCaml или Lisp, вообще в десять строк.

То есть скорее всего если бы мне нужно было напрограммировать такой язык, выбрал бы какой-то существующий транслятор Питона и его ковырял, но тебе же для фана, хочется с нуля? :)

Deleted
()
Ответ на: комментарий от Deleted

Спасибо за интерес, обязательно разберусь. А что из этого написано руками, а что автосгенерировано?

но тебе же для фана, хочется с нуля? :)

да :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Кстати, да, я задумался и понял что не знаю как парсить Питоно-подобные языки.

PEG-ом они парсятся элементарно.

Там не очень все просто, у него из-за «скобочек» отступами не совсем контекстно-свободная грамматика, и чтоб ее сделать такой, в лексере делают псевдо-токены INDENT и DEDENT.

Не нужны токены. Не нужны лексеры. Хватит уже носиться со всяким говном из драконьей книги.

anonymous
()
Ответ на: комментарий от anonymous

Да то же самое же практически?

Вот отступы: https://github.com/chrisseaton/katahdin/blob/master/library/indentation.kat

Стек отступов, считает вручную пробелы. Там даже еще креативнее, он отматывает «указатель» назад до начала текущей строки, а потом начинает считать пробелы

Deleted
()
Ответ на: комментарий от true_admin

А что из этого написано руками, а что автосгенерировано?

Все что там есть - руками :)

Там неразбериха только в лексере, и то в одном месте, где эти отступы считаются, лень думать как красивее сделать.

Для того чтоб изменить грамматику нужно:

изменить grammar.lem, там что-то типа EBNF, большими буквами «терминальные токены» - ключевые слова, операторы и т.п. (то что приходит из лексера)

добавить «действие» после правила в {} - это, если на пальцах, м-м, callback, когда парсер парсит это правило, он вызывает это «действие». На всякий случай для легко возбудимых анонов - я знаю слова FSM, shift, reduce и как оно вообще работает

и добавить «терминальный токен», если нужно, в лексер, lexer.l, функция scan. Терминальный токен может задаваться регулярным выражением

Deleted
()
Ответ на: комментарий от Deleted

всё, понял что на чём написано, сорри за беспокойство. Надо было с readme начать.

true_admin ★★★★★
() автор топика

Посмотри на racket. Позиционируется как платформа для написания своих языков: Algol и Prolog на нем, например, есть искаробки.

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

Тред не читай, сразу отвечай

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.