Я использую Lemon в качестве генератора парсеров, его обработка ошибок такая же, как у yacc и bison, если вы не знаете Lemon.
В Lemon есть возможность определить токен ошибки в наборе правил, чтобы отлавливать ошибки синтаксического анализа. По умолчанию сгенерированный парсер уничтожает токен, вызвавший ошибку; Есть ли способ переопределить это поведение, чтобы я мог сохранить токен?
Вот пример, чтобы показать, что происходит: в основном я добавляю токены для каждого правила вместе, чтобы реформировать входную строку, вот пример грамматики:
input ::= string(A) { printf("%s", A); } // Print the result
string(A) ::= string(B) part(C). { A = append(B, C); }
string(A) ::= part(B). { A = B; }
part(A) ::= NUMBER(B) NAME(C). { A = append(C, B); } // Rearrange the number and name
part(A) ::= error(B). { A = B; } // On error keep the token anyways
На входе:
"Username 1234Joseph"
Я получаю вывод:
"Joseph1234"
Поскольку текст «Имя пользователя» отбрасывается синтаксическим анализатором в правиле часть (A) ::= error (B), но я действительно хочу:
"Username Joseph1234"
как вывод.
Если вы можете решить эту проблему в bison или другом генераторе парсеров, я бы принял это как ответ :)