f6c80cb494a4d0e83a10b2bde3eefe1e6378a773
[ghc-hetmet.git] / compiler / parser / HaddockParse.y
1 {
2 module HaddockParse (parseHaddockParagraphs, parseHaddockString) where
3
4 import {-# SOURCE #-} HaddockLex
5 import HsSyn
6 import RdrName
7 }
8
9 %tokentype { Token }
10
11 %token  '/'     { TokSpecial '/' }
12         '@'     { TokSpecial '@' }
13         '['     { TokDefStart }
14         ']'     { TokDefEnd }
15         DQUO    { TokSpecial '\"' }
16         URL     { TokURL $$ }
17         ANAME   { TokAName $$ }
18         '-'     { TokBullet }
19         '(n)'   { TokNumber }
20         '>..'   { TokBirdTrack $$ }
21         IDENT   { TokIdent $$ }
22         PARA    { TokPara }
23         STRING  { TokString $$ }
24
25 %monad { Either String }
26
27 %name parseHaddockParagraphs  doc
28 %name parseHaddockString seq
29
30 %%
31
32 doc     :: { HsDoc RdrName }
33         : apara PARA doc        { docAppend $1 $3 }
34         | PARA doc              { $2 }
35         | apara                 { $1 }
36         | {- empty -}           { DocEmpty }
37
38 apara   :: { HsDoc RdrName }
39         : ulpara                { DocUnorderedList [$1] }
40         | olpara                { DocOrderedList [$1] }
41         | defpara               { DocDefList [$1] }
42         | para                  { $1 }
43
44 ulpara  :: { HsDoc RdrName }
45         : '-' para              { $2 }
46
47 olpara  :: { HsDoc RdrName } 
48         : '(n)' para            { $2 }
49
50 defpara :: { (HsDoc RdrName, HsDoc RdrName) }
51         : '[' seq ']' seq       { ($2, $4) }
52
53 para    :: { HsDoc RdrName }
54         : seq                   { docParagraph $1 }
55         | codepara              { DocCodeBlock $1 }
56
57 codepara :: { HsDoc RdrName }
58         : '>..' codepara        { docAppend (DocString $1) $2 }
59         | '>..'                 { DocString $1 }
60
61 seq     :: { HsDoc RdrName }
62         : elem seq              { docAppend $1 $2 }
63         | elem                  { $1 }
64
65 elem    :: { HsDoc RdrName }
66         : elem1                 { $1 }
67         | '@' seq1 '@'          { DocMonospaced $2 }
68
69 seq1    :: { HsDoc RdrName }
70         : elem1 seq1            { docAppend $1 $2 }
71         | elem1                 { $1 }
72
73 elem1   :: { HsDoc RdrName }
74         : STRING                { DocString $1 }
75         | '/' strings '/'       { DocEmphasis (DocString $2) }
76         | URL                   { DocURL $1 }
77         | ANAME                 { DocAName $1 }
78         | IDENT                 { DocIdentifier $1 }
79         | DQUO strings DQUO     { DocModule $2 }
80
81 strings  :: { String }
82         : STRING                { $1 }
83         | STRING strings        { $1 ++ $2 }
84
85 {
86 happyError :: [Token] -> Either String a
87 happyError toks = 
88 --  Left ("parse error in doc string: "  ++ show (take 3 toks))
89   Left ("parse error in doc string")
90
91 -- Either monad (we can't use MonadError because GHC < 5.00 has
92 -- an older incompatible version).
93 instance Monad (Either String) where
94         return        = Right
95         Left  l >>= _ = Left l
96         Right r >>= k = k r
97         fail msg      = Left msg
98 }