Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
These are errors that Bison catches when generating the parser, so it doesn't effect the end-user experience
В качестве преимуществ ANTLR в том споре приводят всё что угодно, кроме качеств собственно парсинга
Техническая сложность в том, что каждый новый символ, от которого зависит выполнение развёртки, увеличивает размерность таблиц перехода
OP: '{' OPS '}' // блок
| EXPR ';' // выражение
| 'if' '(' EXPR ')' OP
| 'if' '(' EXPR ')' OP 'else' OP
| 'while' '(' EXPR ')' OP
| 'exit' ';' ;
И нет там никаких глобальных таблиц перехода.
Но всегда правильнее преобразовать грамматику
«Качество собственно парсинга», если имеется ввиду производительность
-
OP: '{' OPS '}' // блок
| EXPR ';' // выражение
| 'if' '(' EXPR ')' OP ( 'else' OP )?
| 'while' '(' EXPR ')' OP
| 'exit' ';' ;
OP: '{' OPS '}' // блок
| EXPR ';' // выражение
// вроде, можно не дублировать, но не помню синтаксис
| ( 'if' '(' EXPR ')' OP 'else' OP )=> 'if' '(' EXPR ')' OP 'else' OP
| 'if' '(' EXPR ')' OP
| 'while' '(' EXPR ')' OP
| 'exit' ';' ;
невозможность написания «заплаток» на сгенерированный код, потому что он меняется при изменении грамматики, да ещё и размножается по десяткам функций.
Это одно из самых страшных зол, которые только бывают. Сгенерированный код не должен залатываться!
-
// вроде, можно не дублировать, но не помню синтаксис
| ( 'if' '(' EXPR ')' OP 'else' OP )=> 'if' '(' EXPR ')' OP 'else' OP
| 'if' '(' EXPR ')' OP
'if' '(' expr ')' op ( ('else') => 'else' op)?
Логично в качестве позиции ошибки показывать самую правую, до которой сумела добраться хотя бы одна развёртка, — т.е. последнюю позицию, до которой у парсера ещё были надежды, что текст распарсится удачно.Вообще-то да, есть. Например вот тут: www.meta-alternative.net/mbase.html
Предполагаю, что есть реализации packrat, в которых локализация ошибки реализована именно так.
Более того, у packrat гораздо больше возможностей умного обнаружения ошибок чем у любого другого подхода, потому как в любой момент времени полно метаданных — и перепробованные варианты, и те что обломались, и те что сработали. На каждый можно вполне декларативно навесить логику сообщений об ошибках.
Так же, преимущество packrat перед автоматным LL — возможноть реализации левой рекурии в лоб.
Ну и важнейшее свойство packrat — он lexerless во первых, и расширяемый во вторых. Можно наследовать свойства грамматик, можно расширять грамматики динамически.
Всё это многократно перевешивает мизерные и неинтересные пролемы с большим линейным коэффициентом (есть куча оптимизаций, сокращающих его до минимума) и расходом памяти — на самом деле не так уж и много ее надо — для языков вроде C++ надо помнить не больше чем один top level declaration, а они обычно коротенькие.
Пример того, что можно делать с расширяемыми грамматиками см. вот тут и подробнее тут.
Так что не надо так людей packrat-ом запугивать. У packrat и GLR большое будущее, а автоматам пришел заслуженный конец.
Вам я написал, потому как когда-то у меня была точно такая же позиция (в MBase это легко прослеживается по предыдущей версии автоматного LL-генератора), и у меня был весьма прочищающий мозги разговор с автором языка Kathadin. Мне тогда это пошло на пользу. Возможно, и вам пригодится знание о том, на что способен packrat.
P.S.:
Тем более, что одно из самых естественных применений для новых компиляторов — поддержка всяких компактных платформ, где сэкономленная память имеет значение.Делаем сейчас компактный драйвер для встраиваемых устройств, на основе Clang + LLVM. Там, соответственно, банальный hard-coded recursive descent parser. Clang, как известно, рвет по скорости парсинга всех прочих в хвост и в гриву (хоть он и «ленивый слон»). Так вот, я жалею, что это не Packrat. Для такого типа грамматики мемоизацию можно или отключить или ограничить, а преимуществ было бы немало.
одно из самых естественных применений для новых компиляторов — поддержка всяких компактных платформ, где сэкономленная память имеет значение
Логично в качестве позиции ошибки показывать самую правую, до которой сумела добраться хотя бы одна развёртка
Компиляция. 5: нисходящий разбор