Skip to content

Commit e3f38ce

Browse files
committed
ugly disgusting expression expander
1 parent a3a3c37 commit e3f38ce

1 file changed

Lines changed: 119 additions & 0 deletions

File tree

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package expr_parser.visitors;
2+
3+
import java.util.Map;
4+
5+
import parser.LEMSExpressionBaseVisitor;
6+
import parser.LEMSExpressionParser;
7+
import expr_parser.utils.TextUtils;
8+
9+
public class ExpandSymbols extends LEMSExpressionBaseVisitor<String> {
10+
11+
private Map<String, String> context;
12+
13+
public ExpandSymbols(Map<String, String> context) {
14+
this.context = context;
15+
}
16+
17+
/** expr */
18+
@Override
19+
public String visitExpression(LEMSExpressionParser.ExpressionContext ctx) {
20+
String result;
21+
if (ctx.arithmetic() != null)
22+
result = new String(visit(ctx.arithmetic()));
23+
else if(ctx.logic() != null)
24+
result = new String(visit(ctx.logic()));
25+
else
26+
result = new String(visit(ctx.ternary()));
27+
return result;
28+
}
29+
30+
/** '-' expr */
31+
@Override
32+
public String visitNegate(LEMSExpressionParser.NegateContext ctx) {
33+
String val = visit(ctx.arithmetic());
34+
return "-" + TextUtils.parenthesize(val);
35+
}
36+
37+
/** expr op=POW expr */
38+
@Override
39+
public String visitPow(LEMSExpressionParser.PowContext ctx) {
40+
String left = visit(ctx.arithmetic(0));
41+
String right = visit(ctx.arithmetic(1));
42+
return adaptBinOp(ctx.op.getText(), left, TextUtils.parenthesize(right));
43+
}
44+
45+
private String adaptBinOp(String op, String left, String right) {
46+
return left + op + right;
47+
}
48+
49+
/** FLOAT */
50+
@Override
51+
public String visitFloatLiteral(LEMSExpressionParser.FloatLiteralContext ctx) {
52+
return ctx.FLOAT().getText();
53+
}
54+
55+
/** ID */
56+
@Override
57+
public String visitIdentifier(LEMSExpressionParser.IdentifierContext ctx) {
58+
String id = ctx.ID().getText();
59+
return context.get(id);
60+
}
61+
62+
/** expr op=('*'|'/') expr */
63+
@Override
64+
public String visitMulDiv(LEMSExpressionParser.MulDivContext ctx) {
65+
String left = visit(ctx.arithmetic(0));
66+
String right = visit(ctx.arithmetic(1));
67+
return adaptBinOp(ctx.op.getText(), left, right);
68+
}
69+
70+
/** expr op=('+'|'-') expr */
71+
@Override
72+
public String visitAddSub(LEMSExpressionParser.AddSubContext ctx) {
73+
String left = visit(ctx.arithmetic(0));
74+
String right = visit(ctx.arithmetic(1));
75+
return adaptBinOp(ctx.op.getText(), left, right);
76+
}
77+
78+
/** '(' expr ')' */
79+
@Override
80+
public String visitParenthesized(
81+
LEMSExpressionParser.ParenthesizedContext ctx) {
82+
return ("(" + visit(ctx.arithmetic()) + ")");
83+
}
84+
85+
86+
@Override
87+
public String visitTernary(LEMSExpressionParser.TernaryContext ctx) {
88+
return visit(ctx.logic()) + '?' + visit(ctx.expression(0)) + ':' + visit(ctx.expression(1));
89+
}
90+
91+
@Override
92+
public String visitAnd(LEMSExpressionParser.AndContext ctx) {
93+
String left = visit(ctx.logic(0));
94+
String right = visit(ctx.logic(1));
95+
return adaptBinOp("and", left, right);
96+
97+
}
98+
99+
@Override
100+
public String visitOr(LEMSExpressionParser.OrContext ctx) {
101+
String left = visit(ctx.logic(0));
102+
String right = visit(ctx.logic(1));
103+
return adaptBinOp("or", left, right);
104+
}
105+
106+
@Override
107+
public String visitComparison(LEMSExpressionParser.ComparisonContext ctx) {
108+
String left = visit(ctx.arithmetic(0));
109+
String right = visit(ctx.arithmetic(1));
110+
return adaptBinOp(ctx.op.getText(), left, right);
111+
}
112+
113+
@Override
114+
public String visitFunctionCall(LEMSExpressionParser.FunctionCallContext ctx) {
115+
return TextUtils.funcCall(ctx.builtin().func.getText(), visit(ctx.arithmetic()));
116+
}
117+
118+
119+
}

0 commit comments

Comments
 (0)