1
-----------------------------------------------------------------------------
2
$Id: Parser.ly,v 1.15 2005/01/26 01:10:42 ross Exp $
6
(c) 1993-2000 Andy Gill, Simon Marlow
7
-----------------------------------------------------------------------------
10
> module Parser (ourParser,AbsSyn) where
17
> %tokentype { Token }
19
> id { TokenInfo $$ TokId }
20
> spec_tokentype { TokenKW TokSpecId_TokenType }
21
> spec_token { TokenKW TokSpecId_Token }
22
> spec_name { TokenKW TokSpecId_Name }
23
> spec_partial { TokenKW TokSpecId_Partial }
24
> spec_lexer { TokenKW TokSpecId_Lexer }
25
> spec_imported_identity { TokenKW TokSpecId_ImportedIdentity }
26
> spec_monad { TokenKW TokSpecId_Monad }
27
> spec_nonassoc { TokenKW TokSpecId_Nonassoc }
28
> spec_left { TokenKW TokSpecId_Left }
29
> spec_right { TokenKW TokSpecId_Right }
30
> spec_prec { TokenKW TokSpecId_Prec }
31
> spec_expect { TokenKW TokSpecId_Expect }
32
> spec_error { TokenKW TokSpecId_Error }
33
> spec_attribute { TokenKW TokSpecId_Attribute }
34
> spec_attributetype { TokenKW TokSpecId_Attributetype }
35
> code { TokenInfo $$ TokCodeQuote }
36
> int { TokenNum $$ TokNum }
37
> ":" { TokenKW TokColon }
38
> ";" { TokenKW TokSemiColon }
39
> "::" { TokenKW TokDoubleColon }
40
> "%%" { TokenKW TokDoublePercent }
41
> "|" { TokenKW TokBar }
44
> %lexer { lexer } { TokenEOF }
48
> parser :: { AbsSyn }
49
> : optCode tokInfos "%%" rules optCode
50
> { AbsSyn $1 (reverse $2) (reverse $4) $5 }
52
> rules :: { [(String, [([String],String,Int,Maybe String)], Maybe String)] }
53
> : rules rule { $2 : $1 }
56
> rule :: { (String, [([String],String,Int,Maybe String)], Maybe String) }
57
> : id "::" code ":" prods { ($1,$5,Just $3) }
58
> | id "::" code id ":" prods { ($1,$6,Just $3) }
59
> | id ":" prods { ($1,$3,Nothing) }
62
> prods :: { [([String],String,Int,Maybe String)] }
63
> : prod "|" prods { $1 : $3 }
66
> prod :: { ([String],String,Int,Maybe String) }
67
> : ids prec code ";" {% lineP >>= \l -> return ($1,$3,l,$2) }
68
> | ids prec code {% lineP >>= \l -> return ($1,$3,l,$2) }
70
> prec :: { Maybe String }
71
> : spec_prec id { Just $2 }
74
> tokInfos :: { [Directive String] }
75
> : tokInfos tokInfo { $2 : $1 }
78
> tokInfo :: { Directive String }
79
> : spec_tokentype code { TokenType $2 }
80
> | spec_token tokenSpecs { TokenSpec $2 }
81
> | spec_name id optStart { TokenName $2 $3 False }
82
> | spec_partial id optStart { TokenName $2 $3 True }
83
> | spec_imported_identity { TokenImportedIdentity }
84
> | spec_lexer code code { TokenLexer $2 $3 }
85
> | spec_monad code { TokenMonad "()" $2 ">>=" "return" }
86
> | spec_monad code code { TokenMonad $2 $3 ">>=" "return" }
87
> | spec_monad code code code { TokenMonad "()" $2 $3 $4 }
88
> | spec_monad code code code code { TokenMonad $2 $3 $4 $5 }
89
> | spec_nonassoc ids { TokenNonassoc $2 }
90
> | spec_right ids { TokenRight $2 }
91
> | spec_left ids { TokenLeft $2 }
92
> | spec_expect int { TokenExpect $2 }
93
> | spec_error code { TokenError $2 }
94
> | spec_attributetype code { TokenAttributetype $2 }
95
> | spec_attribute id code { TokenAttribute $2 $3 }
97
> optStart :: { Maybe String }
99
> | {- nothing -} { Nothing }
101
> tokenSpecs :: { [(String,String)] }
102
> : tokenSpec tokenSpecs { $1:$2 }
103
> | tokenSpec { [$1] }
105
> tokenSpec :: { (String,String) }
106
> : id code { ($1,$2) }
108
> ids :: { [String] }
109
> : id ids { $1 : $2 }
110
> | {- nothing -} { [] }
112
> optCode :: { Maybe String }
114
> | {- nothing -} { Nothing }
118
> happyError = lineP >>= \l -> fail (show l ++ ": Parse error\n")