Skip to content

Commit 8c5090d

Browse files
committed
Добавлены оптимизаторы-посетители
1 parent b29986a commit 8c5090d

File tree

3 files changed

+500
-0
lines changed

3 files changed

+500
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.annimon.ownlang.parser.visitors;
2+
3+
import com.annimon.ownlang.exceptions.OperationIsNotSupportedException;
4+
import com.annimon.ownlang.parser.Optimizer;
5+
import com.annimon.ownlang.parser.ast.BinaryExpression;
6+
import com.annimon.ownlang.parser.ast.ConditionalExpression;
7+
import com.annimon.ownlang.parser.ast.Node;
8+
import com.annimon.ownlang.parser.ast.UnaryExpression;
9+
import com.annimon.ownlang.parser.ast.ValueExpression;
10+
11+
/**
12+
* Performs constant folding optimization.
13+
*/
14+
public class ConstantFolding extends OptimizationVisitor<Void> implements Optimizer.Info {
15+
16+
private int binaryExpressionFoldingCount;
17+
private int conditionalExpressionFoldingCount;
18+
private int unaryExpressionFoldingCount;
19+
20+
public ConstantFolding() {
21+
binaryExpressionFoldingCount = 0;
22+
conditionalExpressionFoldingCount = 0;
23+
unaryExpressionFoldingCount = 0;
24+
}
25+
26+
@Override
27+
public int optimizationsCount() {
28+
return binaryExpressionFoldingCount
29+
+ conditionalExpressionFoldingCount
30+
+ unaryExpressionFoldingCount;
31+
}
32+
33+
@Override
34+
public String summaryInfo() {
35+
if (optimizationsCount() == 0) return "";
36+
final StringBuilder sb = new StringBuilder();
37+
if (binaryExpressionFoldingCount > 0) {
38+
sb.append("\nBinaryExpression foldings: ").append(binaryExpressionFoldingCount);
39+
}
40+
if (conditionalExpressionFoldingCount > 0) {
41+
sb.append("\nConditionalExpression foldings: ").append(conditionalExpressionFoldingCount);
42+
}
43+
if (unaryExpressionFoldingCount > 0) {
44+
sb.append("\nUnaryExpression foldings: ").append(unaryExpressionFoldingCount);
45+
}
46+
return sb.toString();
47+
}
48+
49+
@Override
50+
public Node visit(BinaryExpression s, Void t) {
51+
if ( (s.expr1 instanceof ValueExpression) && (s.expr2 instanceof ValueExpression) ) {
52+
binaryExpressionFoldingCount++;
53+
try {
54+
return new ValueExpression(s.eval());
55+
} catch (OperationIsNotSupportedException op) {
56+
binaryExpressionFoldingCount--;
57+
}
58+
}
59+
return super.visit(s, t);
60+
}
61+
62+
@Override
63+
public Node visit(ConditionalExpression s, Void t) {
64+
if ( (s.expr1 instanceof ValueExpression) && (s.expr2 instanceof ValueExpression) ) {
65+
conditionalExpressionFoldingCount++;
66+
try {
67+
return new ValueExpression(s.eval());
68+
} catch (OperationIsNotSupportedException op) {
69+
conditionalExpressionFoldingCount--;
70+
}
71+
}
72+
return super.visit(s, t);
73+
}
74+
75+
@Override
76+
public Node visit(UnaryExpression s, Void t) {
77+
if (s.expr1 instanceof ValueExpression) {
78+
unaryExpressionFoldingCount++;
79+
try {
80+
return new ValueExpression(s.eval());
81+
} catch (OperationIsNotSupportedException op) {
82+
unaryExpressionFoldingCount--;
83+
}
84+
}
85+
return super.visit(s, t);
86+
}
87+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.annimon.ownlang.parser.visitors;
2+
3+
import com.annimon.ownlang.parser.Optimizer;
4+
import com.annimon.ownlang.parser.ast.ExprStatement;
5+
import com.annimon.ownlang.parser.ast.IfStatement;
6+
import com.annimon.ownlang.parser.ast.Node;
7+
import com.annimon.ownlang.parser.ast.TernaryExpression;
8+
import com.annimon.ownlang.parser.ast.ValueExpression;
9+
import com.annimon.ownlang.parser.ast.WhileStatement;
10+
11+
/**
12+
* Performs dead code elimination.
13+
*/
14+
public class DeadCodeElimination extends OptimizationVisitor<Void> implements Optimizer.Info {
15+
16+
private int ifStatementEliminatedCount;
17+
private int ternaryExpressionEliminatedCount;
18+
private int whileStatementEliminatedCount;
19+
20+
@Override
21+
public int optimizationsCount() {
22+
return ifStatementEliminatedCount + ternaryExpressionEliminatedCount
23+
+ whileStatementEliminatedCount;
24+
}
25+
26+
@Override
27+
public String summaryInfo() {
28+
if (optimizationsCount() == 0) return "";
29+
final StringBuilder sb = new StringBuilder();
30+
if (ifStatementEliminatedCount > 0) {
31+
sb.append("\nEliminated IfStatement: ").append(ifStatementEliminatedCount);
32+
}
33+
if (ternaryExpressionEliminatedCount > 0) {
34+
sb.append("\nEliminated TernaryExpression: ").append(ternaryExpressionEliminatedCount);
35+
}
36+
if (whileStatementEliminatedCount > 0) {
37+
sb.append("\nEliminated WhileStatement: ").append(whileStatementEliminatedCount);
38+
}
39+
return sb.toString();
40+
}
41+
42+
@Override
43+
public Node visit(IfStatement s, Void t) {
44+
if (s.expression instanceof ValueExpression) {
45+
ifStatementEliminatedCount++;
46+
// true statement
47+
if (s.expression.eval().asInt() != 0) {
48+
return s.ifStatement;
49+
}
50+
// false statement
51+
if (s.elseStatement != null) {
52+
return s.elseStatement;
53+
}
54+
return new ExprStatement(s.expression);
55+
}
56+
return super.visit(s, t);
57+
}
58+
59+
@Override
60+
public Node visit(TernaryExpression s, Void t) {
61+
if (s.condition instanceof ValueExpression) {
62+
ternaryExpressionEliminatedCount++;
63+
if (s.condition.eval().asInt() != 0) {
64+
return s.trueExpr;
65+
}
66+
return s.falseExpr;
67+
}
68+
return super.visit(s, t);
69+
}
70+
71+
@Override
72+
public Node visit(WhileStatement s, Void t) {
73+
if (s.condition instanceof ValueExpression) {
74+
if (s.condition.eval().asInt() == 0) {
75+
whileStatementEliminatedCount++;
76+
return new ExprStatement(s.condition);
77+
}
78+
}
79+
return super.visit(s, t);
80+
}
81+
}

0 commit comments

Comments
 (0)