Я бы просто попросил лексера отсканировать два токена //
и /
, а затем обработчик разбирал случаи, когда они должны рассматриваться как один токен или как отдельный. То есть правило грамматики, начинающееся с ///
, может фактически быть преобразовано в правило, начинающееся с //
и /
. Другими словами, не иметь TOKEN_2
вообще. В таких же случаях подобные вещи могут быть хитрыми, потому что синтаксический анализатор LARL (1) имеет только один лексем. Он должен принять решение об изменении или уменьшении, основываясь только на просмотре //
, без учета следующего /
.
У меня была идея решить эту проблему с помощью хакерского подхода, включающего лексическую привязку, но это оказалось неосуществимым.
Основной недостаток этой идеи заключается в том, что в yacc нет простого способа восстановления после ошибок, который скрыт от пользователя. Если вызвана синтаксическая ошибка, это видно. Функция yyerror
может содержать взлом, чтобы попытаться это скрыть, но ей не хватает контекстной информации.
Другими словами, вы не можете использовать действия с ошибками Yacc для запуска поиска с возвратом другого анализа.