2 {-# OPTIONS -Wwarn -w #-}
3 -- The above warning supression flag is a temporary kludge.
4 -- While working on this module you are encouraged to remove it and fix
5 -- any warnings in the module. See
6 -- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
10 parseHaddockParagraphs,
15 import {-# SOURCE #-} HaddockLex
24 %token '/' { TokSpecial '/' }
25 '@' { TokSpecial '@' }
28 DQUO { TokSpecial '\"' }
32 '/../' { TokEmphasis $$ }
35 '>..' { TokBirdTrack $$ }
38 STRING { TokString $$ }
40 %monad { EitherString }
42 %name parseHaddockParagraphs doc
43 %name parseHaddockString seq
47 doc :: { HsDoc RdrName }
48 : apara PARA doc { docAppend $1 $3 }
51 | {- empty -} { DocEmpty }
53 apara :: { HsDoc RdrName }
54 : ulpara { DocUnorderedList [$1] }
55 | olpara { DocOrderedList [$1] }
56 | defpara { DocDefList [$1] }
59 ulpara :: { HsDoc RdrName }
62 olpara :: { HsDoc RdrName }
65 defpara :: { (HsDoc RdrName, HsDoc RdrName) }
66 : '[' seq ']' seq { ($2, $4) }
68 para :: { HsDoc RdrName }
69 : seq { docParagraph $1 }
70 | codepara { DocCodeBlock $1 }
72 codepara :: { HsDoc RdrName }
73 : '>..' codepara { docAppend (DocString $1) $2 }
74 | '>..' { DocString $1 }
76 seq :: { HsDoc RdrName }
77 : elem seq { docAppend $1 $2 }
80 elem :: { HsDoc RdrName }
82 | '@' seq1 '@' { DocMonospaced $2 }
84 seq1 :: { HsDoc RdrName }
85 : PARA seq1 { docAppend (DocString "\n") $2 }
86 | elem1 seq1 { docAppend $1 $2 }
89 elem1 :: { HsDoc RdrName }
90 : STRING { DocString $1 }
91 | '/../' { DocEmphasis (DocString $1) }
94 | ANAME { DocAName $1 }
95 | IDENT { DocIdentifier $1 }
96 | DQUO strings DQUO { DocModule $2 }
100 | STRING strings { $1 ++ $2 }
103 happyError :: [Token] -> EitherString a
104 happyError toks = MyLeft ("parse error in doc string")
106 -- We don't want to make an instance for Either String,
107 -- since every user of the GHC API would get that instance
109 -- But why use non-Haskell98 instances when MyEither String
110 -- is the only MyEither we're intending to use anyway? --Isaac Dupree
111 --data MyEither a b = MyLeft a | MyRight b
112 data EitherString b = MyLeft String | MyRight b
114 instance Monad EitherString where
116 MyLeft l >>= _ = MyLeft l
117 MyRight r >>= k = k r
118 fail msg = MyLeft msg