File: SimonsExample.ly

package info (click to toggle)
happy 1.20.1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,300 kB
  • sloc: haskell: 5,916; xml: 3,727; yacc: 2,448; makefile: 318
file content (75 lines) | stat: -rw-r--r-- 1,667 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
> {
> module Parser (parse) where
> import Type
> import Lexer
> }

> %token 
> 	backslash	{ Builtin "\\" }
>  	var		{ Ident $$ }
>  	rightarrow	{ Builtin "->" }
>  	caseT		{ Builtin "case" }
>  	letT		{ Builtin "let" }
>  	ofT		{ Builtin "of" }
>  	inT		{ Builtin "in" }
>  	letnT		{ Builtin "letn" }
>  	leftcurly	{ LeftCurly }
>  	rightcurly	{ RightCurly }
>  	equals		{ Builtin "=" }
>  	colon		{ Builtin ":" }
>  	cons		{ Constructor $$ }
>  	leftbracket	{ LeftBracket }
>  	rightbracket	{ RightBracket }
>  	semicolon	{ SemiColon }
>  	percent		{ Percent }

> %name parse
> %tokentype { Token }

> %%

> expr		
> 	: backslash var binders rightarrow expr
> 					{ foldr Lambda $5 ($2: reverse $3) }
> 	| caseT var ofT leftcurly patterns rightcurly
> 					{ Case $2 (reverse $5) }
> 	| letT var equals var expr inT expr
> 					{ LetApp ($2,$4,$5) $7 }
> 	| letT var equals expr inT expr
> 					{ Let ($2,$4) $6 }
> 	| letnT var equals expr inT expr
>					{ LetN ($2,$4) $6 }
> 
> 	| labelref colon expr		{ Label $1 $3 }
>	| simpleexpr			{ $1 }

> simpleexpr
> 	 : cons simpleexprs	{ Cons $1 (reverse $2) }
>	 | simpleexpr0			{ $1 }
> 
> simpleexprs
> 	: simpleexprs simpleexpr0	{ $2 : $1 }
> 	|				{ [] }
> 
> simpleexpr0
> 	: var				{ Var $1 }
> 	| labelref			{ LabelRef $1 }
> 	| leftbracket expr rightbracket { $2 }
> 
> patterns
> 	: patterns pattern		{ $2 : $1 }
> 	| pattern			{ [ $1 ] }
> 
> pattern	: cons binders rightarrow expr semicolon
> 					{ ($1, reverse $2, $4) }
> 
> binders	: binders var			{ $2 : $1 }
> 	| 				{ [ ] }
> 
> labelref
>	: percent var			{ $2 }

> {
> happyError :: Int -> a
> happyError x = error ("Error at LINE " ++ show x)
> }