1. Ruby / Говнокод #23360

    +1

    1. 1
    https://github.com/ruby/ruby/blob/trunk/parse.y

    Как распарсить Руби код.

    Запостил: wvxvw, 25 Сентября 2017

    Комментарии (9) RSS

    • Лексер ghc им всё равно по говнистости не переплюнуть.
      Ответить
      • Ну, не знаю. Тут в парсере реализовали, по-сути, большую часть Руби. Потому что Руби - контекстно-зависимый. Например foo * 2 может быть (foo (* 2)) а может быть (* foo 2). И это не известно пока не интерпретировали контекст в котором этот код используется. Что интересно, во время выполнения кода, контекст может поменятся в зависимости от пользовательского ввода, и парсер может просто не угадать.
        Зато в Руби парсинг интерполяции заебашили в лексере, и поэтому можно писать "#{foo("bar")}", ну или %Q[#{foo("bar")}] если редактор вдруг не может справиться с подсветкой синтаксиса.

        Нахер они это придумали...
        Ответить
    • Руби прыщеговно
      Ответить
    • https://github.com/ruby/ruby/blob/trunk/lex.c.blt

      это мне больше понравилось. выхлоп gperf про который ранее я даже и не слышал.

      ЗЫ а про лексеры/парсеры, после перла меня уже ничего не удивит. .у там кот наплакал (и граматика весьма регулярная) а вот лексер...
      https://github.com/Perl/perl5/blob/blead/toke.c
      Perl_yylex() - писан на внутренней либе перла (или как говорят перловцы: "перл написан по большей части на перле").
      Ответить
      • > это мне больше понравилось
        А что там особо интересного? Про gperf раньше слышал, но использовать не доводилось.
        Ответить
        • я просто видел много генереных/в ручную писаных распозователей строк, но это первый раз где я вижу генерацию "perfect hash"а.

          я раньше видел генератор, который делал пачку if'ов, которые сравнивали отдельно взятые буквы в подсчитаных позициях, что бы минимальным кол-вом сравнений (а ля дихотомия) распознать слово из словаря. поэтому нечто подобное и ожидал.
          Ответить
    • Дурак смеется над автогенеренный кодом
      Ответить
      • ЛоЛ. Нет, этот код не автогенерированый. Из него генерируют код на Си (обычно, или на других языках, которые Як / Бизон понимает). Обычно сгенерированые файлы называются y.tab.c (можно также заголовки сгенерировать и т.д.)

        Но даже при том, что Як сгенерирует больше говна из этого файла, разница будет не особенно заметна потому что 99% из этого файла он оставит как есть.
        Ответить
        • ты мне будешь говорить что вот это живой человек писал:

          /*%
          $$ = dispatch4(rescue,
          escape_Qundef($2),
          escape_Qundef($3),
          escape_Qundef($5),
          escape_Qundef($6));
          %*/
          ?
          Ответить

    Добавить комментарий