Грамматика:
Statement
= "{" __ !Statement Statement __ "}"
__
= [ \t\r\n]*
Вход:
{x}
Если кеш результатов отключен, приведенное выше приводит к ошибке:
Ожидается "{" или [\ t \ r \ n], но найдено "x".
Когда кеш результатов включен, ошибка изменяется на:
Ожидается [\ t \ r \ n], но найдено "x".
Ошибки должны быть одинаковыми в обоих случаях.
Я полагаюсь на довольно выразительные команды 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 исторически плохо выпускала релизы.
Я надеюсь изменить цикл снятия привязки:
0.12.0
из 0.10.0
,0.11.0
,Если бы что-то подобное произошло при каких-либо действиях, а затем действительно начались релизы, дадите ли вы этому еще один шанс?
Желаю вам удачи в этом.
спасибо 😁
Посмотрим.
Самый полезный комментарий
Вы можете посмотреть исправление здесь .