mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Fix optimization in use statement and match expression with _ matcher
This commit is contained in:
parent
94bbc05b93
commit
1abcffda5d
@ -46,4 +46,14 @@ tasks.register('runOptimizing', JavaExec) {
|
||||
classpath = sourceSets.main.runtimeClasspath
|
||||
ignoreExitValue true
|
||||
args '-o 9 -m -a -f ../program.own'.split(' ')
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('runOptimizationDumper', JavaExec) {
|
||||
group = "application"
|
||||
description = "Run optmizer and dump results"
|
||||
dependsOn classes
|
||||
mainClass = 'com.annimon.ownlang.utils.OptimizationDumper'
|
||||
classpath = sourceSets.main.runtimeClasspath
|
||||
args '../program.own'
|
||||
}
|
||||
//
|
||||
|
@ -74,7 +74,7 @@ public final class MatchExpression extends InterruptableNode implements Expressi
|
||||
final int size = array.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
final Expression expr = p.values.get(i);
|
||||
if ( (expr != TuplePattern.ANY) && (expr.eval().compareTo(array.get(i)) != 0) ) {
|
||||
if ( (expr != ANY) && (expr.eval().compareTo(array.get(i)) != 0) ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -279,26 +279,26 @@ public final class MatchExpression extends InterruptableNode implements Expressi
|
||||
}
|
||||
return "()".concat(super.toString());
|
||||
}
|
||||
|
||||
private static final Expression ANY = new Expression() {
|
||||
@Override
|
||||
public Value eval() {
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(Visitor visitor) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R, T> R accept(ResultVisitor<R, T> visitor, T input) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "_".concat(super.toString());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static final Expression ANY = new Expression() {
|
||||
@Override
|
||||
public Value eval() {
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(Visitor visitor) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R, T> R accept(ResultVisitor<R, T> visitor, T input) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "_";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -99,11 +99,6 @@ public class ConstantFolding extends OptimizationVisitor<Void> implements Optimi
|
||||
return super.visit(s, t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node visit(UseStatement s, Void unused) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node visit(FunctionDefineStatement s, Void t) {
|
||||
if (OPERATORS.contains(s.name)) {
|
||||
|
@ -280,10 +280,12 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
|
||||
final List<Expression> newValues = new ArrayList<>(tuple.values.size());
|
||||
boolean valuesChanged = false;
|
||||
for (Expression value : tuple.values) {
|
||||
final Node node = value.accept(this, t);
|
||||
if (node != value) {
|
||||
valuesChanged = true;
|
||||
value = (Expression) node;
|
||||
if (value != MatchExpression.ANY) {
|
||||
final Node node = value.accept(this, t);
|
||||
if (node != value) {
|
||||
valuesChanged = true;
|
||||
value = (Expression) node;
|
||||
}
|
||||
}
|
||||
newValues.add(value);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user