Подтвердить что ты не робот

Как определить несколько блоков комментариев в Parsec

Я пытаюсь научиться использовать Parsec для написания парсера Delphi, но я зацикливаюсь на определении LanguageDef.

В Delphi существует два типа блоков комментариев, (* comments *) и { comments }. Но типы commentStart и commentEnd языка LanguageDef - это String, а не [String], поэтому я мог бы только поставить один или другой.

Итак, я попытался создать свой собственный синтаксический анализатор whiteSpace, но я не уверен, что могу передать его в makeTokenParser.

Любая помощь будет оценена.

Спасибо


Джон и Крис помогли мне разобраться и решить проблему, но решение включает в себя замену огромного количества парсеров, предоставляемых makeTokenParser, поэтому это не совсем желательно.

Я отправлю сообщение, если найду лучшее решение.

4b9b3361

Ответ 1

Мое чтение файла Text.ParserCombinators.Parsec.Language заключается в том, что это невозможно сделать напрямую с помощью LanguageDef.

Я считаю, что вы на правильном пути, чтобы написать свой собственный парсер whiteSpace. Чтобы использовать его успешно, вам необходимо перезаписать парсер whiteSpace, который генерируется makeTokenParser. TokenParser, созданный makeTokenParser, является записью с каждым полем, содержащим синтаксический анализатор. Мы можем создать новую копию записи с заменой одного из этих полей следующим образом:

-- ask GCHi for the type actual type signature constraints
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
  originalTokenParser {whiteSpace = myWhiteSpaceParser}