-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatatypes.rkt
More file actions
161 lines (122 loc) · 4.65 KB
/
datatypes.rkt
File metadata and controls
161 lines (122 loc) · 4.65 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#lang racket
(require (lib "eopl.ss" "eopl"))
(define-datatype program program?
(a-program (stmnts statements?)))
(define-datatype statements statements?
(a-statement (stmnt statement?))
(some-statements (stmnts statements?) (stmnt statement?)))
(define-datatype statement statement?
(compound-statement (comp compound?))
(simple-statement (smpl simple?)))
(define-datatype simple simple?
(assignment-statement (assign assignment?))
(global-statement (glbl-stmnt global?))
(return-statement (rtrn-stmnt return?))
(pass-statement)
(break-statement)
(continue-statement))
(define-datatype compound compound?
(function-definition (func function?))
(if-statement (if-stmnt if-exp?))
(for-statement (for-stmnt for-exp?)))
(define-datatype assignment assignment?
(an-assignment (var ATOM?) (exp expression?)))
(define-datatype return return?
(void-return)
(exp-return (exp expression?)))
(define-datatype global global?
(a-global (var ATOM?)))
(define-datatype function function?
(function-statement (name ATOM?) (pars parameters?) (body statements?))
(function-statement-noargs (name ATOM?) (body statements?)))
(define-datatype parameters parameters?
(assignment-parameter (assign assignment?))
(all-parameters (params parameters?) (assign assignment?)))
(define-datatype if-exp if-exp?
(an-if-exp (exp expression?) (stmnts statements?) (else-stmnt else-exp?)))
(define-datatype else-exp else-exp?
(an-else-exp (stmnts statements?)))
(define-datatype for-exp for-exp?
(a-for-exp (var ATOM?) (iterator expression?) (body statements?)))
(define-datatype expression expression?
(an-expression (disjunc disjunction?)))
(define-datatype disjunction disjunction?
(a-disjunction (disj disjunction?) (conj conjunction?))
(conjunction-exp (conj conjunction?)))
(define-datatype conjunction conjunction?
(a-conjunction (conj conjunction?) (inv inversion?))
(inversion-exp (inv inversion?)))
(define-datatype inversion inversion?
(an-inversion (inv inversion?))
(comp-exp (comp comparison?)))
(define-datatype comparison comparison?
(equal-sum (eq eq-exp?))
(lessthan-sum (lt lt-exp?))
(lessthanorequal-sum (let let-exp?))
(greaterthan-sum (gt gt-exp?))
(greaterthanorequal-sum (get get-exp?))
(sum-expression (sum sum-exp?)))
(define-datatype eq-exp eq-exp?
(an-eq-exp (num1 sum-exp?) (num2 sum-exp?)))
(define-datatype lt-exp lt-exp?
(a-lt-exp (num1 sum-exp?) (num2 sum-exp?)))
(define-datatype let-exp let-exp?
(a-let-exp (num1 sum-exp?) (num2 sum-exp?)))
(define-datatype gt-exp gt-exp?
(a-gt-exp (num1 sum-exp?) (num2 sum-exp?)))
(define-datatype get-exp get-exp?
(a-get-exp (num1 sum-exp?) (num2 sum-exp?)))
(define-datatype sum-exp sum-exp?
(plus-term (num1 sum-exp?) (num2 term-exp?))
(minus-term (num1 sum-exp?) (num2 term-exp?))
(term-expression (term term-exp?)))
(define-datatype term-exp term-exp?
(times-factor (num1 term-exp?) (num2 factor-exp?))
(divides-factor (num1 term-exp?) (num2 factor-exp?))
(factor-expression (factor factor-exp?)))
(define-datatype factor-exp factor-exp?
(plus-power (pow power-exp?))
(minus-power (pow power-exp?))
(power-expression (pow power-exp?)))
(define-datatype power-exp power-exp?
(pow-exp (num1 ATOM?) (num2 factor-exp?))
(primary-expression (prim primary-exp?)))
(define-datatype primary-exp primary-exp?
(atom-exp (var ATOM?))
(list-idx (prim primary-exp?) (exp expression?))
(func-call (prim primary-exp?) (args arguments-exp?))
(func-call-noargs (prim primary-exp?)))
(define-datatype arguments-exp arguments-exp?
(an-argument (exp expression?))
(some-arguments (args arguments-exp?) (exp expression?)))
(define-datatype ATOM ATOM?
(id-exp (name string?))
(num-exp (num expval?))
(list-expression (l list-exp?))
(true-exp)
(false-exp)
(none-exp))
(define-datatype list-exp list-exp?
(a-list (exps expressions?))
(null-list))
(define-datatype expressions expressions?
(an-exp (exp expression?))
(some-exps (exps expressions?) (exp expression?)))
; Thunk (Lazy evaluation)
(define-datatype exp-thunk exp-thunk?
(expression-thunk (exp expression?) (glob_env environment?) (curr_env environment?)))
(define-datatype func-thunk func-thunk?
(function-thunk (func function?)))
(define-datatype expval expval?
(num-val (num number?))
(bool-val (bool boolean?))
(list-val (array list?))
(none-val))
(define-datatype func func?
(a-func (name ATOM?) (args arguments-exp?) (body statements?)))
(define-datatype for for?
(a-for (var ATOM?) (iterator list-exp?) (body statements?)))
(define-datatype environment environment?
(empty-environment)
(extend-environment (var ATOM?) (val expval?) (env environment?)))
(provide (all-defined-out))