Pegjs: При включении / отключении кеша возвращаются разные ошибки

Созданный на 28 авг. 2016  ·  20Комментарии  ·  Источник: pegjs/pegjs

Грамматика:

Statement
  = "{" __ !Statement Statement __ "}"
__
  = [ \t\r\n]*

Вход:

{x}

Если кеш результатов отключен, приведенное выше приводит к ошибке:

Ожидается "{" или [\ t \ r \ n], но найдено "x".

Когда кеш результатов включен, ошибка изменяется на:

Ожидается [\ t \ r \ n], но найдено "x".

Ошибки должны быть одинаковыми в обоих случаях.

Исходный отчет

Самый полезный комментарий

Вы можете посмотреть исправление здесь .

Все 20 Комментарий

Я полагаюсь на довольно выразительные команды SyntaxError s pegjs для создания автозавершения синтаксиса для пользователей.

Однако эта проблема не позволяет мне сделать это для более сложных грамматик:

  • с включенным кешем подавляет возможные совпадения
  • без кеша разбор сильно замедляется, что делает его непригодным для использования

Еще одна грамматика, к которой относится ошибка:

Start
    = Char+ End

End
    = "e"

Char
    = (!End [a-z])+

Вход:

a

Если кеш результатов отключен, приведенное выше приводит к ошибке:

Ожидается «e», [az] или не «e», но найден конец ввода.

Когда кеш результатов включен, ошибка изменяется на:

Ожидается [az], но найден конец ввода.

Ошибка отключения кеша верна, поскольку ae соответствует грамматике.

Неудачные тестовые случаи добавлены с # 555

Причина этой проблемы, по-видимому, в следующем:

  • во время начальной оценки правила вызывается peg$expect для записи ожидаемых токенов. Однако в некоторых случаях ( peg$silentFails > 0 ) токены игнорируются.

  • во время кэшированной оценки кешированный результат восстанавливается. На этом этапе синтаксический анализатор должен не только восстановить новое состояние синтаксического анализа, но и воспроизвести соответствующие вызовы peg$expect . В противном случае он пропускает ожидаемые токены. Это проявляется в неполных сообщениях об ошибках, показанных выше.

В локальном прототипе, основанном на [email protected] я смог исправить эту проблему, записав и воспроизведя вызовы peg$expect . Однако с изменениями, внесенными в https://github.com/pegjs/pegjs/commit/669f782a5f3928a2958147992eb07df5b0ecf54a, все стало намного сложнее.

Я могу попытаться исправить ошибку pegjs@dev . Просто интересно, в правильном ли направлении я иду.

Есть комментарии @Mingun , @futagoza?

Можете ли вы показать мне свой локальный прототип на основе [email protected] ?

Вы можете посмотреть исправление здесь .

Он пока не работает должным образом для вложенных элементов с отключенным звуком:

Грамматика:

Start
  = Char+ End
End "end"
  = "e"
Char
  = !End [a-z]'

Вход:

a

Ожидаемое сообщение:

Ожидается конец, или [az], но найден конец ввода.

Актуальное сообщение:

Ожидается конец, «e» или [az], но найден конец ввода.

Ср. неуспешный тестовый пример .

@nikku Это должно быть решено сейчас (спасибо вам 🙇), когда все 3 тестовых примера пройдут (включая третий для вложенных элементов с тишиной).

Исправление присутствует в последней версии pegjs@dev просто отправлено в NPM, [email protected] (https://github.com/pegjs/pegjs#latest).

Спасибо.

Я проверил ваши изменения сегодня.

Из того, что я вижу https://github.com/pegjs/pegjs/commit/f5b323b40124e9ebe1336b509af0716d5a31ce55#diff -cd2c6b13fdcedf68a390c8bb6ea65cafR148 вводит критическое изменение, так как он эффективно удаляет peg$silentFails === 0 охранник в с --no-cache сгенерированных анализаторами .

Ой, это была глупая ошибка. Скоро это исправлю, спасибо за внимание.

Пытался создать тестовый пример, но не удалось: cry :. Однако я вижу, что эта строка влияет на одну из моих более сложных грамматик.

Восстановил охранник в https://github.com/pegjs/pegjs/commit/d06a5b52efcf0fa4b9e5bf21f97607786c1c7db5 и внес изменения в pegjs@dev , скажите мне, решит ли это проблему

@nikku Это исправлено или проблема не устранена? Просто хочу знать, стоит ли мне снова открывать этот выпуск.

Это фиксированная.

@nikku - Не исправлено. Ничего не было выпущено. npm все еще есть 0.10.0 , и это было объединено с веткой 0.11.0 , которая, по словам Рю, на самом деле никогда не будет выпущена

Я перестал надеяться на pegjs и давно искал где-нибудь еще именно по этой причине.

Нет релиза = никто не может его использовать. Pegjs исторически плохо выпускала релизы.

Я надеюсь изменить цикл снятия привязки:

  1. с просьбой к первоначальному владельцу разрешить мне перерезать 0.12.0 из 0.10.0 ,
  2. к выбору вишен и последовательному быстрому выпуску функций из уже мертвой ветки 0.11.0 ,
  3. удалить необычные инструменты и конфигурацию в пользу стандартной установки разработки, и
  4. чтобы разместить библиотеку в месте, где сообществу будет легко добавлять функции

Если бы что-то подобное произошло при каких-либо действиях, а затем действительно начались релизы, дадите ли вы этому еще один шанс?

Желаю вам удачи в этом.

спасибо 😁

Посмотрим.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги