Skip to content
Snippets Groups Projects
Commit db733317 authored by Nathan PERIER's avatar Nathan PERIER
Browse files

Added duplication of variable definitions and a visitor to duplicate expressions (close #31)

parent 2f5a609d
No related branches found
No related tags found
No related merge requests found
Showing
with 155 additions and 0 deletions
......@@ -21,6 +21,13 @@ public class FunctionDef extends VariableDef {
returnType = GenericType.forNumber(0);
}
public FunctionDef(FunctionDef fd) {
super(fd);
params = new ArrayList<>(fd.params);
recursive = fd.recursive;
returnType = fd.returnType;
}
public FunctionDef addParam(VarParam p) {
params.add(p);
return this;
......@@ -47,6 +54,11 @@ public class FunctionDef extends VariableDef {
return this;
}
@Override
public VariableDef duplicate() {
return new FunctionDef(this);
}
@Override
public boolean equals(Object o) {
if(!(o instanceof FunctionDef)) {
......
......@@ -12,6 +12,16 @@ public class ValueDef extends VariableDef {
type = t;
}
public ValueDef(ValueDef vd) {
super(vd);
type = vd.type;
}
@Override
public VariableDef duplicate() {
return new ValueDef(this);
}
@Override
protected void nameToDisplay(StringBuilder builder, String indent) {
builder.append("let ").append(name).append(" : ").append(type);
......
......@@ -20,6 +20,18 @@ public abstract class VariableDef implements Displayable {
nested = new ArrayList<>();
}
public VariableDef(VariableDef vd) {
this(vd.name, vd.pos);
if(vd.expr != null) {
expr = vd.expr.duplicate();
} else {
expr = null;
}
for(NestedDefinition nd : vd.nested) {
nested.add(nd.duplicate());
}
}
public String getName() {
return name;
}
......@@ -42,6 +54,8 @@ public abstract class VariableDef implements Displayable {
abstract protected void nameToDisplay(StringBuilder builder, String indent);
abstract public VariableDef duplicate();
@Override
public void toDisplay(StringBuilder builder, String indent) {
nameToDisplay(builder, indent);
......@@ -68,6 +82,8 @@ public abstract class VariableDef implements Displayable {
private interface NestedDefinition extends Displayable {
NestedDefinition duplicate();
}
private static class NestedVariableDefinition implements NestedDefinition {
......@@ -83,6 +99,11 @@ public abstract class VariableDef implements Displayable {
vard.toDisplay(builder, indent);
}
@Override
public NestedDefinition duplicate() {
return new NestedVariableDefinition(vard.duplicate());
}
}
private static class NestedTypeDefinition implements NestedDefinition {
......@@ -98,6 +119,11 @@ public abstract class VariableDef implements Displayable {
typd.toDisplay(builder, indent);
}
@Override
public NestedDefinition duplicate() {
return this;
}
}
}
\ No newline at end of file
......@@ -21,6 +21,18 @@ public class ConditionExpression extends Expression {
Type.unifyTwo(yes.getType(), no.getType());
}
public Expression getCondition() {
return condition;
}
public Expression getYes() {
return yes;
}
public Expression getNo() {
return no;
}
@Override
public Expression evaluate(Context ctx) {
BoolExpression test = (BoolExpression) condition.evaluate(ctx);
......
package fr.insarennes.nperier.minichamo.language.expressions;
import fr.insarennes.nperier.minichamo.language.expressions.visitor.DuplicateExpressionVisitor;
import fr.insarennes.nperier.minichamo.language.expressions.visitor.ExpressionArgVisitor;
import fr.insarennes.nperier.minichamo.language.expressions.visitor.ExpressionVisitor;
import fr.insarennes.nperier.minichamo.language.typing.Type;
......@@ -16,6 +17,10 @@ public abstract class Expression implements Displayable {
public abstract <V,T> T acceptVisitor(ExpressionArgVisitor<V,T> visitor, V arg);
public Expression duplicate() {
return acceptVisitor(new DuplicateExpressionVisitor());
}
@Override
public String toString() {
return Displayable.getString(this);
......
......@@ -24,6 +24,10 @@ public class NameExpression extends Expression {
type = GenericType.forNumber(cpt.next());
}
public String getName() {
return name;
}
@Override
public Expression evaluate(Context ctx) {
throw new UnsupportedOperationException("A name expression is not associated with a value and should never be evaluated (programmer messed up, please report)");
......
......@@ -14,6 +14,12 @@ public class VarExpression extends Expression {
vard = vd;
}
public VariableDef getUnderlyingDefinition() {
return vard;
}
@Override
public Expression evaluate(Context ctx) {
return vard.getExpression().evaluate(ctx);
......
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.expressions.ConditionExpression;
import fr.insarennes.nperier.minichamo.language.expressions.Expression;
import fr.insarennes.nperier.minichamo.language.expressions.NameExpression;
import fr.insarennes.nperier.minichamo.language.expressions.VarExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.BaseExpression;
public class DuplicateExpressionVisitor extends SimpleExpressionVisitor<Expression> {
@Override
protected Expression visitBase(final BaseExpression e) {
return e;
}
@Override
public Expression visitVar(final VarExpression e) {
return new VarExpression(e.getUnderlyingDefinition().duplicate());
}
@Override
public Expression visitName(final NameExpression e) {
return new NameExpression(e.getName(), e.getType());
}
@Override
public Expression visitCondition(final ConditionExpression e) {
return new ConditionExpression(
e.getCondition().duplicate(),
e.getYes().duplicate(),
e.getNo().duplicate()
);
}
}
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.expressions.base.BaseExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.BoolExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.CharExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.FloatExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.IntExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.StringExpression;
import fr.insarennes.nperier.minichamo.language.expressions.base.UnitExpression;
public abstract class SimpleExpressionVisitor<T> implements ExpressionVisitor<T> {
protected abstract T visitBase(BaseExpression e);
@Override
public T visitUnit(UnitExpression e) {
return visitBase(e);
}
@Override
public T visitBool(BoolExpression e) {
return visitBase(e);
}
@Override
public T visitInt(IntExpression e) {
return visitBase(e);
}
@Override
public T visitFloat(FloatExpression e) {
return visitBase(e);
}
@Override
public T visitChar(CharExpression e) {
return visitBase(e);
}
@Override
public T visitString(StringExpression e) {
return visitBase(e);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment