Как определить множественный тип блока комментариев в Parsec
Я пытаюсь научиться использовать Parsec
для написания синтаксического анализатора Delphi, но я застрял на определении LanguageDef.
(* comments *)
и { comments }
.
Но типы commentStart & commentEnd LanguageDef-это String, а не [String], поэтому я мог бы вставить только один или другой.
Итак, я попытался сделать свой собственный синтаксический анализатор пробелов, но я не уверен, что смогу передать его в makeTokenParser
.
Любая помощь была бы оцененный.
Спасибо
Джон и Крис помогли мне понять и обойти проблему, но решение включает в себя замену огромного количества парсеров, которые предоставляет
makeTokenParser
, поэтому это не совсем желательно.
Я снова отправлю сообщение, если смогу найти лучшее решение.
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}