2 module HaddockParse (parseHaddockParagraphs, parseHaddockString) where
4 import {-# SOURCE #-} HaddockLex
11 %token '/' { TokSpecial '/' }
12 '@' { TokSpecial '@' }
15 DQUO { TokSpecial '\"' }
20 '>..' { TokBirdTrack $$ }
23 STRING { TokString $$ }
25 %monad { Either String }
27 %name parseHaddockParagraphs doc
28 %name parseHaddockString seq
32 doc :: { HsDoc RdrName }
33 : apara PARA doc { docAppend $1 $3 }
36 | {- empty -} { DocEmpty }
38 apara :: { HsDoc RdrName }
39 : ulpara { DocUnorderedList [$1] }
40 | olpara { DocOrderedList [$1] }
41 | defpara { DocDefList [$1] }
44 ulpara :: { HsDoc RdrName }
47 olpara :: { HsDoc RdrName }
50 defpara :: { (HsDoc RdrName, HsDoc RdrName) }
51 : '[' seq ']' seq { ($2, $4) }
53 para :: { HsDoc RdrName }
54 : seq { docParagraph $1 }
55 | codepara { DocCodeBlock $1 }
57 codepara :: { HsDoc RdrName }
58 : '>..' codepara { docAppend (DocString $1) $2 }
59 | '>..' { DocString $1 }
61 seq :: { HsDoc RdrName }
62 : elem seq { docAppend $1 $2 }
65 elem :: { HsDoc RdrName }
67 | '@' seq1 '@' { DocMonospaced $2 }
69 seq1 :: { HsDoc RdrName }
70 : elem1 seq1 { docAppend $1 $2 }
73 elem1 :: { HsDoc RdrName }
74 : STRING { DocString $1 }
75 | '/' strings '/' { DocEmphasis (DocString $2) }
77 | ANAME { DocAName $1 }
78 | IDENT { DocIdentifier $1 }
79 | DQUO strings DQUO { DocModule $2 }
83 | STRING strings { $1 ++ $2 }
86 happyError :: [Token] -> Either String a
88 -- Left ("parse error in doc string: " ++ show (take 3 toks))
89 Left ("parse error in doc string")
91 -- Either monad (we can't use MonadError because GHC < 5.00 has
92 -- an older incompatible version).
93 instance Monad (Either String) where