-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.y
93 lines (81 loc) · 2.86 KB
/
grammar.y
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
91
92
93
{
module Grammar where
import Lexer
}
%name parse
%tokentype { Token }
%monad { E } { thenE } { returnE }
%error { parseError }
%token
COMMENT { TokComment }
FLOAT { TokFloat $$ }
INT { TokInt $$ }
STRING { TokStr $$ }
PUSH { TokPush }
POP { TokPop }
LINE { TokLine }
CIRCLE { TokCircle }
HERMITE { TokHermite }
BEZIER { TokBezier }
BOX { TokBox }
SPHERE { TokSphere }
TORUS { TokTorus }
IDENT { TokIdent }
SCALE { TokScale }
MOVE { TokMove }
ROTATE { TokRotate }
CLEAR { TokClear }
VARY { TokVary }
FRAMES { TokFrames }
BASENAME { TokBasename }
APPLY { TokApply }
DISPLAY { TokDisplay }
SAVE { TokSave }
%%
Combiner : Statement { Atom $1 }
| Combiner Combiner { Node $1 $2 }
Statement : COMMENT { Comment }
| PUSH { Push }
| POP { Pop }
| LINE Num Num Num Num Num Num { Line ($2,$3,$4) ($5,$6,$7) }
| CIRCLE Num Num Num Num { Circle ($2,$3,$4) $5 }
| HERMITE INT INT INT INT INT INT INT INT { Hermite ($2,$3) ($4,$5) ($6,$7) ($8,$9) }
| BEZIER INT INT INT INT INT INT INT INT { Bezier ($2,$3) ($4,$5) ($6,$7) ($8,$9) }
| BOX Num Num Num Num Num Num { Box ($2,$3,$4) ($5,$6,$7) }
| SPHERE Num Num Num Num { Sphere ($2,$3,$4) $5}
| TORUS Num Num Num Num Num { Torus ($2,$3,$4) $5 $6 }
| IDENT { Ident }
| SCALE Num Num Num { Scale ($2,$3,$4) }
| SCALE Num Num Num STRING { ScaleV ($2,$3,$4) $5 }
| MOVE Num Num Num { Move ($2,$3,$4) }
| MOVE Num Num Num STRING { MoveV ($2,$3,$4) $5 }
| ROTATE STRING Num { Rotate $2 $3 }
| ROTATE STRING Num STRING { RotateV $2 $3 $4 }
| CLEAR { Clear }
| VARY STRING INT INT INT INT { Vary $2 ($3,$4) ($5,$6) }
| FRAMES INT { Frames $2 }
| BASENAME STRING { Basename $2 }
| APPLY { Apply }
| DISPLAY { Display }
| SAVE STRING { Save $2 }
Num : FLOAT { $1 }
| INT { fromInteger $1 :: Double }
{
data E a = Ok a | Failed String
thenE :: E a -> (a -> E b) -> E b
m `thenE` k =
case m of
Ok a -> k a
Failed e -> Failed e
returnE :: a -> E a
returnE a = Ok a
failE :: String -> E a
failE err = Failed err
catchE :: E a -> (String -> E a) -> E a
m `catchE` k =
case m of
Ok a -> Ok a
Failed e -> k e
parseError :: [Token] -> E a
parseError tks = failE $ "Parse error!" ++ show tks
}