This repository has been archived by the owner on May 25, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLogic.java
144 lines (128 loc) · 3.9 KB
/
Logic.java
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
import java.util.*;
/**
*
* @author 13513006 / Rahman Adianto, 13513022 / Husni Munaya
*/
public class Logic extends Expression {
/**
* A constructor.
* Membuat objek Arithmetic
* @param ekspresi
*/
public Logic(String ekspresi) {
super(ekspresi);
}
/**
* Mengkalkulasi ekspresi
* @return hasil perhitungan
*/
public boolean calculate() {
Stack<Boolean> calc = new Stack<>();
boolean operan1, operan2;
String word_temp;
Scanner sc = new Scanner(ekspresi);
while (sc.hasNext()) {
word_temp = sc.next();
if (isOperan(word_temp)) {
calc.push(Boolean.parseBoolean(word_temp));
} else {
if (word_temp.equals("not")) {
operan1 = calc.pop();
calc.push(unaryOpt(word_temp, operan1));
} else {
operan2 = calc.pop();
operan1 = calc.pop();
calc.push(binaryOpt(word_temp, operan1, operan2));
}
}
}
return calc.peek();
}
/**
* Method yang mengembalikan hasil dari operasi binary
* Menghitung dua buah integer
* @param oprt sebuah string
* @param a sebuah float
* @param b sebuah float
* @return hasil perhitungan operasi binary
*/
public boolean binaryOpt(String oprt, boolean a, boolean b) {
switch(oprt) {
case "and":
return a && b;
case "xor":
return a ^ b;
case "or":
return a || b;
default:
return false;
}
}
/**
* Method yang mengembalikan hasil dari operasi unary
* Menghitung satu buah integer
* @param oprt sebuah string
* @param a sebuah boolean
* @return boolean yang merupakan hasil operasi unary
*/
public boolean unaryOpt(String oprt, boolean a) {
return oprt.equals("not") ? !a : false;
}
/**
* Fungsi yang mengecek apakah string berupa operan
* @param opr yang berupa operan
* @return boolean yang bernilai true jika string == operan
*/
@Override
public boolean isOperan(String opr) {
return opr.equals("true") || opr.equals("false");
}
/**
* Fungsi yang mengecek apakah string berupa operator
* @param oprt yang berupa operator
* @return boolean yang bernilai true jika string == operator
*/
@Override
public boolean isOperator(String oprt) {
return oprt.equals("and") || oprt.equals("or") || oprt.equals("xor") || oprt.equals("not");
}
/**
* Fungsi yang mengecek apakah operator o1 mempunyai prioritas lebih dibanding o2
* @param o1 operator yang berupa string
* @param o2 operator yang berupa string
* @return boolean yang bernilai true jika o1 memiliki prioritas lebih dibanding o2
*/
@Override
public boolean higherPrecedence(String o1, String o2) {
return (getOperatorWeight(o1) > getOperatorWeight(o2));
}
/**
* Fungsi yang menghasilkan berat operator
* @param op operator yang berupa string
* @return integer yang merupakan bobot dari operator
*/
@Override
public int getOperatorWeight(String op) {
switch(op) {
case "not":
return 4;
case "and":
return 3;
case "xor":
return 2;
case "or":
return 1;
default:
return 0;
}
}
/**
* Method yang mengecek apakah string berupa operator unary
* @param oprt sebuah string
* @return boolean yang bernilai true jika oprt berupa operator unary
*/
@Override
public boolean isUnaryOpt(String oprt) {
return oprt.equals("not");
}
}