Я хотел бы использовать Парсек makeTokenParser
для создания моего синтаксического анализатора но я хочу использовать свое собственное определение whiteSpace
. Выполнение следующих замен whiteSpace
с моим определением, но весь lexeme
синтаксические анализаторы все еще используют старое определение (например. P.identifier lexer
будет использовать старый пробел).
...
lexer :: P.TokenParser ()
lexer = l { P.whiteSpace = myWhiteSpace }
where l = P.makeTokenParser myLanguageDef
...
Рассмотрение кода для makeTokenParser
Я думаю, что понимаю, почему это прокладывает себе путь. Я хочу знать, существуют ли какие-либо обходные решения, чтобы не полностью копировать код для makeTokenParser
?
К сожалению, я не думаю, что есть выход. Локальные определения, используемые в makeTokenParser
, рекурсивно ссылаются на самих себя, и поэтому, как вы заметили, лексема
использует whiteSpace
, как определено там, а не ] whiteSpace
элемент записи, который вы заменяете в своем объекте лексера
.
Код дразнителен, потому что он использует те же имена, что и локальные функции в makeTokenParser
, и в качестве записей конструктора TokenParser
. На самом деле это совершенно разные сущности.