-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEvaluatorVar.java
More file actions
121 lines (104 loc) · 3.37 KB
/
Copy pathEvaluatorVar.java
File metadata and controls
121 lines (104 loc) · 3.37 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
/**
Initially written by
@author Cay Hortsman BIG JAVA2
with major modificationn by Antonio Sanchez for
Cosc 20203 Programming Techniques
@version 1.05 2019-10-15
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class EvaluatorVar {
final boolean verbose = true;
private ExpressionTokenizerVar tokenizer;
public Hashtable symbolTable; // Hashtable<String,Integer>;
/**
* Constructs an evaluator.
* @param inSymbolTable a Hashtable to be assigned to symbolTable
*/
public EvaluatorVar(Hashtable inSymbolTable)
{ symbolTable = inSymbolTable; }
/**
* Evaluates the expression.
* @param Expression the string to determine the assignment value from
* @return the value of the assignment expression
*/
public Variable getAssignmentValue(String Expression) {
Variable value = new Variable();
value.RHS = 0;
tokenizer = new ExpressionTokenizerVar(Expression);
String next = tokenizer.peekToken();
value.LHS = tokenizer.nextToken(); // determine variable name
next = tokenizer.peekToken();
if ("=".equals(next) )
{ tokenizer.nextToken(); // discard =
value.RHS = getExpressionValue(); // determine variable value
}
else System.out.println ("Assignment error" );
if (verbose) System.out.println ("value delivered Assign " + value.RHS);
return value;
}
/**
* Evaluates the expression.
* @return the value of the expression
*/
public double getExpressionValue() {
double value = getTermValue(); // go search for * / terms
boolean done = false;
while(!done) {
String next = tokenizer.peekToken();
if ("+".equals(next) || "-".equals(next)) {
tokenizer.nextToken(); //Discard the "+" or "-"
double value2 = getTermValue();
if ("+".equals(next)) value += value2;
else value -= value2;
}
else done = true;
}
return value;
}
/**
* Evaluates the next term in the expression.
* @return the value of the term
*/
public double getTermValue() {
double value = getFactorValue(); // go search for ( )
boolean done = false;
while(!done) {
String next = tokenizer.peekToken();
if ("*".equals(next) || "/".equals(next)) {
tokenizer.nextToken(); //Discard the "*" or "/"
double value2 = getFactorValue();
if ("*".equals(next)) value *= value2;
else value /= value2;
}
else done = true;
}
return value;
}
/**
* Evaluates the next factor found in the expression.
* @return the value of the factor
*/
public double getFactorValue() {
double value; String variable;
String next = tokenizer.peekToken();
if ("(".equals(next)) {
tokenizer.nextToken(); //Discard the "("
value = getExpressionValue(); // recursively go back to expression value
tokenizer.nextToken(); //Discard the ")"
}
else { variable = tokenizer.nextToken();
try { value = Double.parseDouble(variable); }
catch (NumberFormatException e)
{ // try a set of Coded values for value in the hashtable
if (symbolTable.containsKey(variable))
value = (double) (symbolTable.get(variable)) ;
else value = 0;
}
}
if (verbose) System.out.println ("Factor value delivered " + value);
return value;
}
}