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


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

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

Любая помощь была бы оцененный.

Спасибо


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

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

1 12

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}