-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterpreter.pl
More file actions
executable file
·140 lines (92 loc) · 4.88 KB
/
interpreter.pl
File metadata and controls
executable file
·140 lines (92 loc) · 4.88 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
/***
A skeleton for Assignment 3 on PROP HT2019 at DSV/SU.
Peter Idestam-Almquist, 2019-12-09.
***/
/***
Load the tokenizer (tokenize/2) and the filewriter (write_to_file/3).
***/
:- [tokenizer].
:- [filewriter].
/***
The top level predicate run/2 of the solution.
To be called like this:
?- run('/Users/paulinakekkonen/Documents/Github/PROP_Assignment3/program2.txt','/Users/paulinakekkonen/Documents/Github/PROP_Assignment3/myparsetree2.txt').
***/
run(InputFile,OutputFile):-
tokenize(InputFile,Program),
parse(ParseTree, Program, []),
evaluate(ParseTree,[],VariablesOut),
write_to_file(OutputFile,ParseTree,VariablesOut).
/* WRITE YOUR CODE FOR THE PARSER HERE */
parse(block(left_curly, ST, right_curly))-->['{'], stmts(ST), ['}'].
stmts(statements(AS, ST))-->assign(AS), stmts(ST).
stmts(statements) --> [].
assign(assignment(ID, assign_op, EX, semicolon))-->id(ID), [=], expr(EX), [;].
expr(expression(T, add_op, EX))-->term(T), [+], expr(EX).
expr(expression(T, sub_op, EX))-->term(T), [-], expr(EX).
expr(expression(T))-->term(T).
term(term(F, mult_op, T))-->factor(F), [*], term(T).
term(term(F, div_op, T))-->factor(F), [/], term(T).
term(term(F))-->factor(F).
factor(factor(INT))-->integer(INT).
factor(factor(IDENT))-->id(IDENT).
factor(factor(left_paren, EX, right_paren))-->['('], expr(EX), [')'].
id(ident(X))-->[X], {atom(X)}.
integer(int(X))-->[X], {integer(X)}.
/***
evaluate(+ParseTree,+VariablesIn,-VariablesOut):-
Evaluates a parse-tree and returns the state of the program
after evaluation as a list of variables and their values in
the form [var = value, ...].
***/
evaluate(block(left_curly, ST, right_curly), VariablesIn, VariablesOut) :-
evaluate(ST, VariablesIn, Result),
VariablesOut = Result.
evaluate(statements(AS, ST), VariablesIn, VariablesOut) :-
evaluate(AS,VariablesIn, R1), evaluate(ST, [R1 | VariablesIn], R2), VariablesOut = [R1|R2].
evaluate(statements, VariablesIn, VariablesOut).
evaluate(assignment(ID, assign_op, EX, semicolon), VariablesIn, VariablesOut) :-
evaluatear(ID, VariablesIn, R1), evaluate(EX, VariablesIn, R2), built_equality_structure(R1, R2, VariablesOut).
evaluate(expression(T, add_op, EX), VariablesIn, VariablesOut) :-
evaluate(T, VariablesIn, R1), evaluateAdd(EX, VariablesIn, R2, R1), VariablesOut is R2;
evaluate(T, VariablesIn, R1), evaluate(EX, VariablesIn, R2, R1), VariablesOut is R2.
evaluate(expression(T, add_op, EX), VariablesIn, VariablesOut, ValueSoFar) :-
evaluate(T, VariablesIn, R1), NewValuesSoFar is ValueSoFar + R1, evaluateAdd(EX, VariablesIn, R2, NewValuesSoFar), VariablesOut is R2;
evaluate(T, VariablesIn, R1), NewValuesSoFar is ValueSoFar + R1, evaluate(EX, VariablesIn, R2, NewValuesSoFar), VariablesOut is R2.
evaluate(expression(T, sub_op, EX), VariablesIn, VariablesOut) :-
evaluate(T, VariablesIn, R1), evaluateSub(EX, VariablesIn, R2, R1), VariablesOut is R2;
evaluate(T, VariablesIn, R1), evaluate(EX, VariablesIn, R2, R1), VariablesOut is R2.
evaluate(expression(T, sub_op, EX), VariablesIn, VariablesOut, ValueSoFar) :-
evaluate(T, VariablesIn, R1), NewValuesSoFar is ValueSoFar - R1, evaluateSub(EX, VariablesIn, R2, NewValuesSoFar), VariablesOut is R2;
evaluate(T, VariablesIn, R1), NewValuesSoFar is ValueSoFar - R1, evaluate(EX, VariablesIn, R2, NewValuesSoFar), VariablesOut is R2.
evaluate(expression(T), VariablesIn, VariablesOut) :-
evaluate(T, VariablesIn, VariablesOut).
evaluateSub(expression(T), VariablesIn, VariablesOut, ValueSoFar) :-
evaluate(T, VariablesIn, Res), VariablesOut is ValueSoFar-Res.
evaluateAdd(expression(T), VariablesIn, VariablesOut, ValueSoFar) :-
evaluate(T, VariablesIn, Res), VariablesOut is ValueSoFar+Res.
evaluate(term(F, mult_op, T), VariablesIn, VariablesOut) :-
evaluate(F, VariablesIn, R1), evaluate(T, VariablesIn, R2), VariablesOut is R1*R2.
evaluate(term(F, div_op, T), VariablesIn, VariablesOut) :-
evaluate(F, VariablesIn, R1), evaluate(T, VariablesIn, R2), VariablesOut is R1/R2.
evaluate(term(F), VariablesIn, VariablesOut) :-
evaluate(F, VariablesIn, VariablesOut).
evaluate(factor(INT), VariablesIn, VariablesOut) :-
evaluate(INT, VariablesIn, VariablesOut).
evaluate(factor(IDENT), VariablesIn, VariablesOut) :-
evaluate(IDENT, VariablesIn, Res), Res is VariablesOut.
evaluate(factor(left_paren, EX, right_paren), VariablesIn, VariablesOut) :-
evaluate(EX, VariablesIn, VariablesOut).
evaluate(ident(X), VariablesIn, VariablesOut) :-
my_member(X=VariablesOut, VariablesIn); not_member(X=_, VariablesIn), VariablesOut = 0.
evaluatear(ident(X), VariablesIn, VariablesOut) :-
VariablesOut = X.
evaluate(ident(X), VariablesIn, VariablesOut) :-
VariablesOut = X.
evaluate(int(X), VariablesIn, VariablesOut) :-
VariablesOut = X.
built_equality_structure(Id,Value,Id=Value).
my_member(X, [X|Xs]).
my_member(X, [_Y|Xs]):- member(X, Xs).
not_member(X, []).
not_member(X, [Y|Xs]) :- X \= Y, not_member(X, Xs).