Fix CodingStyle#Warnings URLs
[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         '-'     { TokBullet }
26         '(n)'   { TokNumber }
27         '>..'   { TokBirdTrack $$ }
28         IDENT   { TokIdent $$ }
29         PARA    { TokPara }
30         STRING  { TokString $$ }
31
32 %monad { Either String }
33
34 %name parseHaddockParagraphs  doc
35 %name parseHaddockString seq
36
37 %%
38
39 doc     :: { HsDoc RdrName }
40         : apara PARA doc        { docAppend $1 $3 }
41         | PARA doc              { $2 }
42         | apara                 { $1 }
43         | {- empty -}           { DocEmpty }
44
45 apara   :: { HsDoc RdrName }
46         : ulpara                { DocUnorderedList [$1] }
47         | olpara                { DocOrderedList [$1] }
48         | defpara               { DocDefList [$1] }
49         | para                  { $1 }
50
51 ulpara  :: { HsDoc RdrName }
52         : '-' para              { $2 }
53
54 olpara  :: { HsDoc RdrName } 
55         : '(n)' para            { $2 }
56
57 defpara :: { (HsDoc RdrName, HsDoc RdrName) }
58         : '[' seq ']' seq       { ($2, $4) }
59
60 para    :: { HsDoc RdrName }
61         : seq                   { docParagraph $1 }
62         | codepara              { DocCodeBlock $1 }
63
64 codepara :: { HsDoc RdrName }
65         : '>..' codepara        { docAppend (DocString $1) $2 }
66         | '>..'                 { DocString $1 }
67
68 seq     :: { HsDoc RdrName }
69         : elem seq              { docAppend $1 $2 }
70         | elem                  { $1 }
71
72 elem    :: { HsDoc RdrName }
73         : elem1                 { $1 }
74         | '@' seq1 '@'          { DocMonospaced $2 }
75
76 seq1    :: { HsDoc RdrName }
77         : elem1 seq1            { docAppend $1 $2 }
78         | elem1                 { $1 }
79
80 elem1   :: { HsDoc RdrName }
81         : STRING                { DocString $1 }
82         | '/' strings '/'       { DocEmphasis (DocString $2) }
83         | URL                   { DocURL $1 }
84         | ANAME                 { DocAName $1 }
85         | IDENT                 { DocIdentifier $1 }
86         | DQUO strings DQUO     { DocModule $2 }
87
88 strings  :: { String }
89         : STRING                { $1 }
90         | STRING strings        { $1 ++ $2 }
91
92 {
93 happyError :: [Token] -> Either String a
94 happyError toks = 
95 --  Left ("parse error in doc string: "  ++ show (take 3 toks))
96   Left ("parse error in doc string")
97
98 -- Either monad (we can't use MonadError because GHC < 5.00 has
99 -- an older incompatible version).
100 instance Monad (Either String) where
101         return        = Right
102         Left  l >>= _ = Left l
103         Right r >>= k = k r
104         fail msg      = Left msg
105 }