1> { 2> module Parser (parse) where 3> import Type 4> import Lexer 5> } 6 7> %token 8> backslash { Builtin "\\" } 9> var { Ident $$ } 10> rightarrow { Builtin "->" } 11> caseT { Builtin "case" } 12> letT { Builtin "let" } 13> ofT { Builtin "of" } 14> inT { Builtin "in" } 15> letnT { Builtin "letn" } 16> leftcurly { LeftCurly } 17> rightcurly { RightCurly } 18> equals { Builtin "=" } 19> colon { Builtin ":" } 20> cons { Constructor $$ } 21> leftbracket { LeftBracket } 22> rightbracket { RightBracket } 23> semicolon { SemiColon } 24> percent { Percent } 25 26> %name parse 27> %tokentype { Token } 28 29> %% 30 31> expr 32> : backslash var binders rightarrow expr 33> { foldr Lambda $5 ($2: reverse $3) } 34> | caseT var ofT leftcurly patterns rightcurly 35> { Case $2 (reverse $5) } 36> | letT var equals var expr inT expr 37> { LetApp ($2,$4,$5) $7 } 38> | letT var equals expr inT expr 39> { Let ($2,$4) $6 } 40> | letnT var equals expr inT expr 41> { LetN ($2,$4) $6 } 42> 43> | labelref colon expr { Label $1 $3 } 44> | simpleexpr { $1 } 45 46> simpleexpr 47> : cons simpleexprs { Cons $1 (reverse $2) } 48> | simpleexpr0 { $1 } 49> 50> simpleexprs 51> : simpleexprs simpleexpr0 { $2 : $1 } 52> | { [] } 53> 54> simpleexpr0 55> : var { Var $1 } 56> | labelref { LabelRef $1 } 57> | leftbracket expr rightbracket { $2 } 58> 59> patterns 60> : patterns pattern { $2 : $1 } 61> | pattern { [ $1 ] } 62> 63> pattern : cons binders rightarrow expr semicolon 64> { ($1, reverse $2, $4) } 65> 66> binders : binders var { $2 : $1 } 67> | { [ ] } 68> 69> labelref 70> : percent var { $2 } 71 72> { 73> happyError :: Int -> a 74> happyError x = error ("Error at LINE " ++ show x) 75> } 76