Пользовательский пробел с помощью Парсека Haskell

Я хотел бы использовать Парсек makeTokenParser для создания моего синтаксического анализатора но я хочу использовать свое собственное определение whiteSpace. Выполнение следующих замен whiteSpace с моим определением, но весь lexeme синтаксические анализаторы все еще используют старое определение (например. P.identifier lexer будет использовать старый пробел).

...
lexer :: P.TokenParser ()
lexer      = l { P.whiteSpace = myWhiteSpace }
   where l = P.makeTokenParser myLanguageDef
...

Рассмотрение кода для makeTokenParser Я думаю, что понимаю, почему это прокладывает себе путь. Я хочу знать, существуют ли какие-либо обходные решения, чтобы не полностью копировать код для makeTokenParser?

6
задан fryguybob 14 April 2010 в 23:25
поделиться

1 ответ

К сожалению, я не думаю, что есть выход. Локальные определения, используемые в makeTokenParser , рекурсивно ссылаются на самих себя, и поэтому, как вы заметили, лексема использует whiteSpace , как определено там, а не ] whiteSpace элемент записи, который вы заменяете в своем объекте лексера .

Код дразнителен, потому что он использует те же имена, что и локальные функции в makeTokenParser , и в качестве записей конструктора TokenParser . На самом деле это совершенно разные сущности.

7
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: