Яuбy / Говнокод #23360 Ссылка на оригинал

0

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

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

Запостил: wvxvw wvxvw, (Updated )

Комментарии (14) 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));
        %*/
        ?
        Ответить
        • Мне кажется Сивоконь прав. Даже если автогенеренный, то выглядит слишком несимметрично.
          Ответить
          • сивоконь один хуй пафосный дурак
            Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8