html текст
All interests
  • All interests
  • Design
  • Food
  • Gadgets
  • Humor
  • News
  • Photo
  • Travel
  • Video
Click to see the next recommended page
Like it
Don't like
Add to Favorites

Bison для JavaScript

Нет, не Jison. А полноценный генератор яваскриптовых парсеров с полной поддержкой бизона.


Начнем с главного вопроса.

Зачем?



Стало нужно портировать большой сишный парсер на яваскрипт без потери мелких деталей оригинала. Очень повезло, что оригинальный парсер написан в терминах yacc/bison, а не руками на хардкорном Си.

Когда настала пора портировать этот парсер, первое, что пришло в голову, это загуглить «javascript bison parser». Конечно, первым же результатом выпал Jison. Вот радость-то, подумалось тогда. Однако, первый же эксперимент показал, что Jison не умеет делать большой кусок работы с промежуточными состояниями. Это такие кабэ токены, при попадании на которые надо выполнить кусочек своего кода, чтобы, например, подсказать лексеру в каком он сейчас контексе. Краткая переписка в гитхабе проекта утешения не принесла. Вместо автора ответил очень подкованный чувак. Он написал там, по-моему, целую книгу с кучей подробностей! Пришлось трижды перечитать и понять: да, увы, придется ковырять оригинальный bison.

Bison



Сразу скажу, что бизон очень хорошо спроектирован. Вместо того, чтобы хардкодить внутри генератора какие-то конструкции, бизон использует язык шаблонов, с помощью которого красиво раскладывает нужные переменные и таблички в результирующий парсер. Для каждого из трех языков есть свой шаблон, называемый скелетом (skeleton). И всё бы хорошо, но язык шаблонов GNU m4 там просто ужасен. Из-за этого анахронизма, вместо того, чтобы спокойно портировать скелет для явы, пришлось джва дня разбираться только с шаблонным мусором.

lalr1.js



Так называется скелет для яваскрипта — lalr1.js. Они там все братья лалры :)

В итоге получилось очень даже ничего. Берем какой-нибуть grammar.y в одну руку, lalr1.js — в другую, и бац:
bison -S ./lalr1.js grammar.y

получаем grammar.js, который после запиливания к нему лексера очень даже может что-то распарсить.

Ах, да. Важно не забыть заменить весь Си код в этом самом grammar.y на яваскрипт. Ну, и лексер запилить. Ну, и еще потестить хорошенько, сравнив логи парсера на Си и парсера на яваскрипте.

Эпилог



Как обычно, делалось всё потому, что было жуть как интересно. Но при этом удалось довести результат до беты. Если среди вас окажутся люди, заинтересованные генерацией яваскриптовых парсеров (ну, там для кофескрипта, или прямо сразу яваскрипта), то буду очень рад помощи в обкатке всего этого в деле. Поиграть можно, забрав исходники с github.com/bison-lalr1.js и установив себе bison и v8/d8.
Читать дальше
Twitter
Одноклассники
Мой Мир

материал с habrahabr.ru

3

      Add

      You can create thematic collections and keep, for instance, all recipes in one place so you will never lose them.

      No images found
      Previous Next 0 / 0
      500
      • Advertisement
      • Animals
      • Architecture
      • Art
      • Auto
      • Aviation
      • Books
      • Cartoons
      • Celebrities
      • Children
      • Culture
      • Design
      • Economics
      • Education
      • Entertainment
      • Fashion
      • Fitness
      • Food
      • Gadgets
      • Games
      • Health
      • History
      • Hobby
      • Humor
      • Interior
      • Moto
      • Movies
      • Music
      • Nature
      • News
      • Photo
      • Pictures
      • Politics
      • Psychology
      • Science
      • Society
      • Sport
      • Technology
      • Travel
      • Video
      • Weapons
      • Web
      • Work
        Submit
        Valid formats are JPG, PNG, GIF.
        Not more than 5 Мb, please.
        30
        surfingbird.ru/site/
        RSS format guidelines
        500
        • Advertisement
        • Animals
        • Architecture
        • Art
        • Auto
        • Aviation
        • Books
        • Cartoons
        • Celebrities
        • Children
        • Culture
        • Design
        • Economics
        • Education
        • Entertainment
        • Fashion
        • Fitness
        • Food
        • Gadgets
        • Games
        • Health
        • History
        • Hobby
        • Humor
        • Interior
        • Moto
        • Movies
        • Music
        • Nature
        • News
        • Photo
        • Pictures
        • Politics
        • Psychology
        • Science
        • Society
        • Sport
        • Technology
        • Travel
        • Video
        • Weapons
        • Web
        • Work

          Submit

          Thank you! Wait for moderation.

          Тебе это не нравится?

          You can block the domain, tag, user or channel, and we'll stop recommend it to you. You can always unblock them in your settings.

          • habrahabr.ru
          • домен habrahabr.ru

          Get a link

          Спасибо, твоя жалоба принята.

          Log on to Surfingbird

          Recover
          Sign up

          or

          Welcome to Surfingbird.com!

          You'll find thousands of interesting pages, photos, and videos inside.
          Join!

          • Personal
            recommendations

          • Stash
            interesting and useful stuff

          • Anywhere,
            anytime

          Do we already know you? Login or restore the password.

          Close

          Add to collection

             

            Facebook

            Ваш профиль на рассмотрении, обновите страницу через несколько секунд

            Facebook

            К сожалению, вы не попадаете под условия акции