2015-11-07 3 views
0

Я пытаюсь написать синтаксический анализатор для языка музыки Lilypond в JavaScript. Мои первые попытки ручной работы работают, но могут работать только с очень маленьким подмножеством языка. Поскольку Lilypond использует файлы бизонов для определения своей грамматики [1], а JISON утверждает, что может работать с бизонами, моя идея состояла в том, чтобы, возможно, использовать эти определения для генерации парсера в JavaScript.Как сгенерировать парсер с JISON из файла бизона

Я не могу найти примеров этого в любом месте, и попытки передать эти файлы непосредственно в JISON просто порождает ошибки.

Что было бы лучшим способом приблизиться к этому?

[1]: см https://github.com/lilypond/lilypond/blob/master/lily/lexer.ll и https://github.com/lilypond/lilypond/blob/master/lily/parser.yy),

ответ

1

СА относительно() легко: раздеть код C (вы должны держать конструкцию AST сначала, чтобы увидеть, как они это сделали), сохранить (JISON понимает синтаксис Bison в некоторой степени) и заполняет код для заполнения AST. Lexer довольно сложный, и я не знаю, поддерживаются ли все специальные функции Flex JISON, но в противном случае: перейдите, как описано выше для части анализатора.

Но это все еще будет много работы, это точно ;-)

EDIT: После некоторого вертела с грамматикой заверешена и поиском в Интернете для получения дополнительной информации, которую я споткнулся над следующей цитатой:

В грамматике LilyPond много странных вещей и hellip;

По заверешен разработчиков под названием "даков" в https://lwn.net/Articles/561990/

Я согласен.

+0

Не могли бы вы быть более конкретными в тех шагах, которые мне пришлось бы пройти? Из-за отсутствия специфики в документации Bison, а также в JISON, я даже не знаю, какие файлы или какой вид выхода бизона использовать, и какие файлы будут работать как вход для JISON. (Edit: Я согласен с тем, что грамматика Lilypond странна.) – mauritslamers

+0

Я не могу быть более конкретным, не будучи слишком конкретным, что делает весь порт сам. Да, это так плохо. Для начала: я просто удалил C-код из файла Bison, и JISON забился в самом первом выпуске (тот, который является самым верхним в файле). BTW: JISON возвращает любую полезную диагностику, пока вы не прокомментируете конструкции 'try ... catch' вокруг четырех парсерных вызовов в строках 163 и следуете в' jison/lib/cli.js'. Итак ... как я могу это выразить ... вы попросили EMScripten попробовать? – deamentiaemundi

+0

Я как бы понял, что определение грамматики Bison написано с использованием языка, на котором должен быть написан парсер. Я предположил, что грамматика абстрактна и может быть «портирована» на любой язык, который я теперь вижу, очевидно, не является случай. BTW Я попробовал запустить JISON с параметром -t, но это не имело никакого значения. – mauritslamers