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