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