1 package visitor;
2
3 import calculator.Notation;
4
5 import calculator.operations.Operation;
6 import calculator.atoms.*;
7 import calculator.functions.BinaryFunction;
8 import calculator.functions.UnaryFunction;
9 import calculator.Expression;
10
11
12
13
14
15
16
17
18
19
20 public class Printer extends Visitor {
21
22
23
24
25
26 private final StringBuilder sb = new StringBuilder();
27
28
29
30 private final Notation notation;
31
32
33
34
35
36
37
38
39 public Printer(Notation notation) {
40 this.notation = notation;
41 }
42
43
44
45
46
47 public Printer() {
48 this.notation = Notation.INFIX;
49 }
50
51
52
53
54
55
56
57
58 @Override
59 public void visit(Real r) {
60 sb.append(r.getValue().stripTrailingZeros());
61 }
62
63 @Override
64 public void visit(IntegerAtom i) {
65 sb.append(i.getValue());
66 }
67
68 @Override
69 public void visit(Complex c) {
70 double realPart = c.getValue().getReal();
71 double imaginaryPart = c.getValue().getImaginary();
72
73 switch (notation) {
74 case PREFIX -> {
75 sb.append("+ ").append(realPart).append(" ").append(imaginaryPart).append("i");
76 }
77 case POSTFIX -> {
78 sb.append(realPart).append(" ").append(imaginaryPart).append("i +");
79 }
80 case INFIX -> {
81 sb.append(realPart).append(" + ").append(imaginaryPart).append("i");
82 }
83 }
84 }
85
86 @Override
87 public void visit(Rationnal q) {
88 int num = q.getNumerator();
89 int den = q.getDenominator();
90
91 if (den == 1) {
92 sb.append(num);
93 return;
94 }
95
96 switch (notation) {
97 case PREFIX -> {
98 sb.append("/ ").append(num).append(" ").append(den);
99 }
100 case POSTFIX -> {
101 sb.append(num).append(" ").append(den).append(" /");
102 }
103 case INFIX -> {
104 sb.append(num).append("/").append(den);
105 }
106 }
107 }
108
109
110
111
112
113
114
115
116
117
118 @Override
119 public void visit(Operation o) {
120 switch (notation) {
121 case PREFIX -> {
122 sb.append(o.getSymbol()).append(" (");
123 visitArgs(o, ", ");
124 sb.append(")");
125 }
126 case INFIX -> {
127 sb.append("( ");
128 visitArgs(o, " " + o.getSymbol() + " ");
129 sb.append(" )");
130 }
131 case POSTFIX -> {
132 sb.append("(");
133 visitArgs(o, ", ");
134 sb.append(") ").append(o.getSymbol());
135 }
136 }
137 }
138
139 @Override
140 public void visit(UnaryFunction o) {
141 switch (notation) {
142 case PREFIX, INFIX -> {
143 sb.append(o.getSymbol()).append("(");
144 o.getArg().accept(this);
145 sb.append(")");
146 }
147 case POSTFIX -> {
148 sb.append("(");
149 o.getArg().accept(this);
150 sb.append(")").append(o.getSymbol());
151 }
152 }
153 }
154
155
156
157
158
159
160
161
162 private void visitArgs(Operation o, String separator) {
163 for (Expression arg : o.getArgs()) {
164 arg.accept(this);
165 sb.append(separator);
166 }
167
168 if (sb.length() > 0) {
169 sb.setLength(sb.length() - separator.length());
170 }
171 }
172
173
174
175
176
177
178
179
180 public String getResult() {
181 return sb.toString();
182 }
183
184 @Override
185 public void visit(BinaryFunction f) {
186 switch (notation) {
187 case PREFIX, INFIX -> {
188 sb.append(f.getSymbol()).append("(");
189 f.getFirstArg().accept(this);
190 sb.append(", ");
191 f.getSecondArg().accept(this);
192 sb.append(")");
193 }
194 case POSTFIX -> {
195 sb.append("(");
196 f.getFirstArg().accept(this);
197 sb.append(", ");
198 f.getSecondArg().accept(this);
199 sb.append(")").append(f.getSymbol());
200 }
201 }
202 }
203
204 }