-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathast.rkt
More file actions
89 lines (75 loc) · 2.6 KB
/
ast.rkt
File metadata and controls
89 lines (75 loc) · 2.6 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
#lang racket
;; AST of TIP language
(provide (all-defined-out))
(struct Fun (name args locals body) #:transparent)
#|
Var ::= Symbol
Expr ::= Int | Bool | Var | Plus | Minus | Mult | Div |
Greater | Equal | Input | App |
AddrOf | Malloc | DeRef | Null
|#
(struct Plus (lhs rhs) #:transparent)
(struct Minus (lhs rhs) #:transparent)
(struct Mult (lhs rhs) #:transparent)
(struct Div (lhs rhs) #:transparent)
(struct Greater (lhs rhs) #:transparent)
(struct Equal (lhs rhs) #:transparent)
(struct Input () #:transparent)
(struct App (fun args) #:transparent)
(struct AddrOf (var) #:transparent)
(struct Malloc () #:transparent)
(struct DeRef (e) #:transparent)
(struct Null () #:transparent)
#|
Stmt ::= NoOp | Output | Return | While | Assign | If | Stmt*
|#
(struct NoOp () #:transparent)
(struct Output (expr) #:transparent)
(struct Return (expr) #:transparent)
(struct While (cnd body) #:transparent)
(struct Assign (id e) #:transparent)
(struct If (cnd thn els) #:transparent)
(struct Seq (stmts) #:transparent)
#|
Program ::= Fun*
|#
(struct Program (funs))
;; Auxiliary functions
(define not-constant?
(λ (x) (and (not (integer? x)) (not (boolean? x)))))
(define (expr-contains-var? expr var)
(match expr
[(? integer?) #f]
[(? boolean? x) #f]
[(? symbol? x) (eq? x var)]
[(Plus l r) (or (expr-contains-var? l var)
(expr-contains-var? r var))]
[(Minus l r) (or (expr-contains-var? l var)
(expr-contains-var? r var))]
[(Mult l r) (or (expr-contains-var? l var)
(expr-contains-var? r var))]
[(Div l r) (or (expr-contains-var? l var)
(expr-contains-var? r var))]
[(Greater l r) (or (expr-contains-var? l var)
(expr-contains-var? r var))]
[(Equal l r) (or (expr-contains-var? l var)
(expr-contains-var? r var))]
;; TODO: handle function pointer
[(App f args) (ormap (λ (e) (expr-contains-var? e var)) args)]
[(AddrOf x) (eq? x var)]
[(DeRef e) (expr-contains-var? e var)]
[else #f]))
(define (get-vars e)
(match e
[(? symbol? x) (set x)]
[(Plus l r) (set-union (get-vars l) (get-vars r))]
[(Minus l r) (set-union (get-vars l) (get-vars r))]
[(Mult l r) (set-union (get-vars l) (get-vars r))]
[(Div l r) (set-union (get-vars l) (get-vars r))]
[(Greater l r) (set-union (get-vars l) (get-vars r))]
[(Equal l r) (set-union (get-vars l) (get-vars r))]
;; TODO: handle function pointers
[(App f args) (list->set (map get-vars args))]
[(AddrOf var) (set var)]
[(DeRef e) (get-vars e)]
[else (set)]))