У меня возникли проблемы с тем, как использовать любую из функций модуля Text.Parsec.Indent
, предоставленного indents
пакет для Haskell, который является своего рода дополнением для Parsec.
Что делают все эти функции? Как их использовать?
Я могу понять краткое описание Haddock withBlock
, и я нашел примеры использования withBlock
, runIndent
и IndentParser
типа здесь, здесь и здесь. Я также понимаю документацию для четырех парсеров indentBrackets
и друзей. Но многие вещи все еще меня путают.
В частности:
-
В чем разница между
withBlock f a p
иdo aa <- a pp <- block p return f aa pp
Аналогично, какая разница между
withBlock' a p
иdo {a; block p}
-
В семействе функций
indented
и друзья, каков уровень ссылки? То есть, что такое 'ссылка? -
Опять же, с функциями
indented
и друзьями, как их использовать? За исключениемwithPos
, похоже, что они не принимают аргументов и все типаIParser ()
(IParser определяется как this или this), поэтому я предполагаю, что все, что они могут сделать, это создать ошибку или нет и что они должны появиться в блокеdo
, но я не могу понять детали.Я, по крайней мере, нашел несколько примеров использования
withPos
в исходный код, поэтому я, вероятно, могу понять это, если Я смотрю на него достаточно долго. -
<+/>
содержит полезное описание "<+/>
- это чувствительные к отступу парсы, чтоap
принадлежит монадам" Это здорово, если вы хотите провести несколько сеансов, пытаясь обернуть голову вокругap
, а затем выясните, как это аналогично парсеру. Остальные три комбинатора определяются со ссылкой на<+/>
, что делает всю группу неприступной для новичков.Нужно ли использовать их? Могу ли я просто игнорировать их и вместо этого использовать
do
? -
Обычный
lexeme
combator и < Парсер t224 > от Parsec будет счастливо потреблять новые строки в середине конструкции с несколькими токенами без жалоб. Но в языке с отступом иногда вы хотите прекратить разбор лексической конструкции или выбросить ошибку, если строка сломана, а следующая строка отступом меньше, чем должно быть. Как мне сделать это в Parsec? -
В language Я пытаюсь разобрать, в идеале, правила, когда лексической структуре разрешено продолжать следующая строка должна зависеть от того, какие маркеры появляются в конце первой строки или в начале следующей строки. Есть ли простой способ достичь этого в Parsec? (Если это сложно, то это не то, что мне нужно в это время заботиться.)