File: DavesExample.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 (90 lines) | stat: -rw-r--r-- 2,116 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Parses simple lambda expressions to combinators

> { 

> module Parser where

> import Lexer
> import Convert
> import PreludeGlaArray

> }

> %name parse
> %tokentype { Token }
> %token idT		{ Ident $$ }
>        numT		{ Number $$ }
>        boolT		{ Boolean $$ }
>        "("		{ LeftBracket }
>        ")"		{ RightBracket }
>        "["		{ LeftSquare }
>        "]"		{ RightSquare }
>        "[]"		{ EmptyList }
>	 ";"		{ SemiColon }
>	 ":"		{ Colon }
>        "+"		{ Infix "+" }
>        "-"		{ Infix "-" }
>        "/"		{ Infix "/" }
>        "*"		{ Infix "*" }
>        "=="		{ Infix "==" }
>        "/="		{ Infix "/=" }
>        ">"		{ Infix ">" }
>        "<"		{ Infix "<" }
>        ">="		{ Infix ">=" }
>        "<="		{ Infix "<=" }
>	 "="		{ Builtin "=" }
>        "else"		{ Builtin "else" }
>        "if"		{ Builtin "if" }
>	 "in"		{ Builtin "in" }
>	 "let"		{ Builtin "let" }
>	 "then"		{ Builtin "then" }
>	 "end"		{ Builtin "end" }
> %%

> P : "let" Dec "in" B		{ mkLet $2 $4}
>   | "if" B "then" B "else" B	{ mkIf $2 $4 $6}
>   | B				{ $1 }

> B :: { Seq (Ptr Exp) }
> B : E "==" E			{ mkOp $1 Equ $3 }
>   | E "/=" E			{ mkOp $1 NEq $3 }
>   | E ">" E			{ mkOp $1 GT $3 }
>   | E "<" E			{ mkOp $1 LT $3 }
>   | E ">=" E			{ mkOp $1 GTE $3 }
>   | E "<=" E			{ mkOp $1 LTE $3 }
>   | E				{ $1 }

> E :: { Seq (Ptr Exp) }
> E : E "+" T			{ mkOp $1 Add $3}
>   | E "-" T			{ mkOp $1 Sub $3}
>   | T                         { $1 }

> T :: { Seq (Ptr Exp) }
> T : T "*" F			{ mkOp $1 Mul $3 }
>   | T "/" F			{ mkOp $1 Quo $3 }
>   | F                      	{ $1 }

> F :: { Seq (Ptr Exp) }
> F : "(" B ")"			{ $2 }
>      | numT			{ mkNum $1 }
>      | boolT			{ mkBool $1 }
>      | idT			{ newPtr (mkVar $1) }
>      | Apps			{ mkApps $1 }

> Apps :: { Seq [Ptr Exp] }
> Apps : F Apps			{ mkApp $1 $2 }
>      | F			{ mkAtom $1 }

> Dec :: { (Token,Seq (Ptr Exp)) }
> Dec : idT Args "=" B		{ ($1, mkFun $1 $2 $4) }

> Args :: { [Exp] }
> Args : idT Args		{ mkVar $1 : $2}
>      | 			{ [] }

> {

> happyError :: Text a => a -> b
> happyError x = error ("Parse error, line " ++ show x ++ "\n")

> }