Я прохожу курс компиляторов в моем университете. Я предпочитаю делать проект с использованием Haskell + Parsec. Лексер и синтаксический анализатор должны быть отдельными. Я использую Parsec для преобразования строки в список токенов, который затем будет передан другому парсеру Parsec, который преобразует список токенов в AST.
Проблема в том, что лексер должен продолжать попытки лексирования даже в случае ошибки. Чтобы попытаться сделать это, я ввел токен, представляющий «неожиданный токен», в мой тип данных Token, и я попытался добавить в свой код <|> неожиданно, чтобы создать этот токен в случае ошибки. Это много шаблонов, и также может быть сложно понять, где их разместить.
Я предпочел бы каким-то образом сделать так, чтобы Parsec автоматически делал это: если когда-либо возникает ParseError, генерировать неожиданный токен в этой позиции и продолжать синтаксический анализ одной позиции позже. Как бы я это сделал?
Вот фрагмент кода, который у меня есть сейчас: http://lpaste.net/8144414997276000256 По какой-то причине Я все еще могу получить ошибку синтаксического анализа, даже если токен Unexpected должен улавливать необработанные случаи.