indents-0.3.0: indentation sensitive parser-combinators for parsec

Text.Parsec.Indent

Contents

Synopsis

Documentation

A module to construct indentation aware parsers. Many programming language have indentation based syntax rules e.g. python and Haskell. This module exports combinators to create such parsers.

The input source can be thought of as a list of tokens. Abstractly each token occurs at a line and a column and has a width. The column number of a token measures is indentation. If t1 and t2 are two tokens then we say that indentation of t1 is more than t2 if the column number of occurrence of t1 is greater than that of t2.

Currently this module supports two kind of indentation based syntactic structures which we now describe:

Block
A block of indentation c is a sequence of tokens with indentation at least c. Examples for a block is a where clause of Haskell with no explicit braces.
Line fold
A line fold starting at line l and indentation c is a sequence of tokens that start at line l and possibly continue to subsequent lines as long as the indentation is greater than c. Such a sequence of lines need to be folded to a single line. An example is MIME headers. Line folding based binding separation is used in Haskell as well.

Types

type IndentParserT s u m a = ParsecT s u (StateT SourcePos m) aSource

Indentation sensitive parser type. Usually m will be Identity as with any ParsecT

runIndent :: Monad m => SourceName -> StateT SourcePos m a -> m aSource

Run the result of an indentation sensitive parse

Blocks

withBlock :: (Stream s (StateT SourcePos m) Char, Monad m) => (a -> [b] -> c) -> IndentParserT s u m a -> IndentParserT s u m x -> IndentParserT s u m b -> IndentParserT s u m cSource

withBlock f a b p parses a and optionally b followed by an indented block of p , combining them with f

withBlock' :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m a -> IndentParserT s u m x -> IndentParserT s u m b -> IndentParserT s u m [b]Source

Like withBlock, but throws away initial parse result

block :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m a -> IndentParserT s u m [a]Source

Parses a block of lines at the same indentation level

Indentation Checking

indented :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m ()Source

Parses only when indented past the level of the reference

same :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m ()Source

Parses only on the same line as the reference

sameOrIndented :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m ()Source

Parses only when indented past the level of the reference or on the same line

checkIndent :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m ()Source

Ensures the current indentation level matches that of the reference

withPos :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m a -> IndentParserT s u m aSource

Parses using the current location for indentation reference

Paired characters

indentBrackets :: (Stream s (StateT SourcePos m) Char, Monad m) => GenTokenParser s u (StateT SourcePos m) -> IndentParserT s u m a -> IndentParserT s u m aSource

parses with surrounding brackets

indentAngles :: (Stream s (StateT SourcePos m) Char, Monad m) => GenTokenParser s u (StateT SourcePos m) -> IndentParserT s u m a -> IndentParserT s u m aSource

parses with surrounding angle brackets

indentBraces :: (Stream s (StateT SourcePos m) Char, Monad m) => GenTokenParser s u (StateT SourcePos m) -> IndentParserT s u m a -> IndentParserT s u m aSource

parses with surrounding braces

indentParens :: (Stream s (StateT SourcePos m) Char, Monad m) => GenTokenParser s u (StateT SourcePos m) -> IndentParserT s u m a -> IndentParserT s u m aSource

parses with surrounding parentheses

Line Fold Chaining

Any chain using these combinators must used with withPos

(<+/>) :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m (a -> b) -> IndentParserT s u m a -> IndentParserT s u m bSource

<+/> is to indentation sensitive parsers what ap is to monads

(<-/>) :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m a -> IndentParserT s u m b -> IndentParserT s u m aSource

<-/> is like <+/>, but doesn't apply the function to the parsed value

(<*/>) :: (Stream s (StateT SourcePos m) Char, Monad m) => IndentParserT s u m ([a] -> b) -> IndentParserT s u m a -> IndentParserT s u m bSource

Like <+/> but applies the second parser many times