Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Nathan.Perier/minichamo
1 result
Show changes
Commits on Source (2)
Showing
with 164 additions and 23 deletions
...@@ -21,6 +21,13 @@ public class FunctionDef extends VariableDef { ...@@ -21,6 +21,13 @@ public class FunctionDef extends VariableDef {
returnType = GenericType.forNumber(0); 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) { public FunctionDef addParam(VarParam p) {
params.add(p); params.add(p);
return this; return this;
...@@ -47,6 +54,11 @@ public class FunctionDef extends VariableDef { ...@@ -47,6 +54,11 @@ public class FunctionDef extends VariableDef {
return this; return this;
} }
@Override
public VariableDef duplicate() {
return new FunctionDef(this);
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if(!(o instanceof FunctionDef)) { if(!(o instanceof FunctionDef)) {
......
...@@ -12,6 +12,16 @@ public class ValueDef extends VariableDef { ...@@ -12,6 +12,16 @@ public class ValueDef extends VariableDef {
type = t; type = t;
} }
public ValueDef(ValueDef vd) {
super(vd);
type = vd.type;
}
@Override
public VariableDef duplicate() {
return new ValueDef(this);
}
@Override @Override
protected void nameToDisplay(StringBuilder builder, String indent) { protected void nameToDisplay(StringBuilder builder, String indent) {
builder.append("let ").append(name).append(" : ").append(type); builder.append("let ").append(name).append(" : ").append(type);
......
...@@ -20,6 +20,18 @@ public abstract class VariableDef implements Displayable { ...@@ -20,6 +20,18 @@ public abstract class VariableDef implements Displayable {
nested = new ArrayList<>(); 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() { public String getName() {
return name; return name;
} }
...@@ -42,6 +54,8 @@ public abstract class VariableDef implements Displayable { ...@@ -42,6 +54,8 @@ public abstract class VariableDef implements Displayable {
abstract protected void nameToDisplay(StringBuilder builder, String indent); abstract protected void nameToDisplay(StringBuilder builder, String indent);
abstract public VariableDef duplicate();
@Override @Override
public void toDisplay(StringBuilder builder, String indent) { public void toDisplay(StringBuilder builder, String indent) {
nameToDisplay(builder, indent); nameToDisplay(builder, indent);
...@@ -68,6 +82,8 @@ public abstract class VariableDef implements Displayable { ...@@ -68,6 +82,8 @@ public abstract class VariableDef implements Displayable {
private interface NestedDefinition extends Displayable { private interface NestedDefinition extends Displayable {
NestedDefinition duplicate();
} }
private static class NestedVariableDefinition implements NestedDefinition { private static class NestedVariableDefinition implements NestedDefinition {
...@@ -83,6 +99,11 @@ public abstract class VariableDef implements Displayable { ...@@ -83,6 +99,11 @@ public abstract class VariableDef implements Displayable {
vard.toDisplay(builder, indent); vard.toDisplay(builder, indent);
} }
@Override
public NestedDefinition duplicate() {
return new NestedVariableDefinition(vard.duplicate());
}
} }
private static class NestedTypeDefinition implements NestedDefinition { private static class NestedTypeDefinition implements NestedDefinition {
...@@ -98,6 +119,11 @@ public abstract class VariableDef implements Displayable { ...@@ -98,6 +119,11 @@ public abstract class VariableDef implements Displayable {
typd.toDisplay(builder, indent); 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 { ...@@ -21,6 +21,18 @@ public class ConditionExpression extends Expression {
Type.unifyTwo(yes.getType(), no.getType()); Type.unifyTwo(yes.getType(), no.getType());
} }
public Expression getCondition() {
return condition;
}
public Expression getYes() {
return yes;
}
public Expression getNo() {
return no;
}
@Override @Override
public Expression evaluate(Context ctx) { public Expression evaluate(Context ctx) {
BoolExpression test = (BoolExpression) condition.evaluate(ctx); BoolExpression test = (BoolExpression) condition.evaluate(ctx);
......
package fr.insarennes.nperier.minichamo.language.expressions; 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.ExpressionArgVisitor;
import fr.insarennes.nperier.minichamo.language.expressions.visitor.ExpressionVisitor; import fr.insarennes.nperier.minichamo.language.expressions.visitor.ExpressionVisitor;
import fr.insarennes.nperier.minichamo.language.typing.Type; import fr.insarennes.nperier.minichamo.language.typing.Type;
...@@ -16,6 +17,10 @@ public abstract class Expression implements Displayable { ...@@ -16,6 +17,10 @@ public abstract class Expression implements Displayable {
public abstract <V,T> T acceptVisitor(ExpressionArgVisitor<V,T> visitor, V arg); public abstract <V,T> T acceptVisitor(ExpressionArgVisitor<V,T> visitor, V arg);
public Expression duplicate() {
return acceptVisitor(new DuplicateExpressionVisitor());
}
@Override @Override
public String toString() { public String toString() {
return Displayable.getString(this); return Displayable.getString(this);
......
...@@ -24,6 +24,10 @@ public class NameExpression extends Expression { ...@@ -24,6 +24,10 @@ public class NameExpression extends Expression {
type = GenericType.forNumber(cpt.next()); type = GenericType.forNumber(cpt.next());
} }
public String getName() {
return name;
}
@Override @Override
public Expression evaluate(Context ctx) { 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)"); 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 { ...@@ -14,6 +14,12 @@ public class VarExpression extends Expression {
vard = vd; vard = vd;
} }
public VariableDef getUnderlyingDefinition() {
return vard;
}
@Override @Override
public Expression evaluate(Context ctx) { public Expression evaluate(Context ctx) {
return vard.getExpression().evaluate(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);
}
}
...@@ -7,7 +7,6 @@ import fr.insarennes.nperier.minichamo.language.definition.VariableDef; ...@@ -7,7 +7,6 @@ import fr.insarennes.nperier.minichamo.language.definition.VariableDef;
import fr.insarennes.nperier.minichamo.language.typing.BuiltinType; import fr.insarennes.nperier.minichamo.language.typing.BuiltinType;
import fr.insarennes.nperier.minichamo.language.typing.GenericType; import fr.insarennes.nperier.minichamo.language.typing.GenericType;
import fr.insarennes.nperier.minichamo.language.typing.Type; import fr.insarennes.nperier.minichamo.language.typing.Type;
import fr.insarennes.nperier.minichamo.lexing.tokens.NameToken;
import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType; import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType;
import fr.insarennes.nperier.minichamo.utils.Counter; import fr.insarennes.nperier.minichamo.utils.Counter;
import fr.insarennes.nperier.minichamo.errors.ParsingException; import fr.insarennes.nperier.minichamo.errors.ParsingException;
...@@ -60,7 +59,7 @@ public class DefinitionParser { ...@@ -60,7 +59,7 @@ public class DefinitionParser {
public static FunctionDef parseRecursiveFunction(TokenPeekIterator it, Context ctx, SymbolPosition pos) { public static FunctionDef parseRecursiveFunction(TokenPeekIterator it, Context ctx, SymbolPosition pos) {
it.expect(TokenType.NAME, "recursive function definition"); it.expect(TokenType.NAME, "recursive function definition");
String name = ((NameToken) it.next()).getString(); String name = it.next().getString();
return parseFunctionDef(it, ctx, name, pos, true); return parseFunctionDef(it, ctx, name, pos, true);
} }
......
...@@ -16,24 +16,10 @@ import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType; ...@@ -16,24 +16,10 @@ import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType;
import fr.insarennes.nperier.minichamo.utils.Counter; import fr.insarennes.nperier.minichamo.utils.Counter;
import fr.insarennes.nperier.minichamo.utils.TokenPeekIterator; import fr.insarennes.nperier.minichamo.utils.TokenPeekIterator;
import java.util.List;
import java.util.Optional; import java.util.Optional;
public class ExpressionParser { public class ExpressionParser {
private static final List<TokenType> ARG_START_TYPES = List.of(
TokenType.UNIT,
TokenType.BOOL,
TokenType.INT,
TokenType.FLOAT,
TokenType.CHAR,
TokenType.STRING,
TokenType.LPAREN,
TokenType.NAME,
TokenType.CONSTRUCT_NAME,
TokenType.LBRACKET
);
public static Expression parse(TokenPeekIterator it, Context ctx) { public static Expression parse(TokenPeekIterator it, Context ctx) {
return parse(it, ctx, new Counter()); return parse(it, ctx, new Counter());
} }
......
package fr.insarennes.nperier.minichamo.parsing; package fr.insarennes.nperier.minichamo.parsing;
import fr.insarennes.nperier.minichamo.language.typing.*; import fr.insarennes.nperier.minichamo.language.typing.BuiltinType;
import fr.insarennes.nperier.minichamo.language.typing.FunctionType;
import fr.insarennes.nperier.minichamo.language.typing.GenericType;
import fr.insarennes.nperier.minichamo.language.typing.NupleType;
import fr.insarennes.nperier.minichamo.language.typing.Type;
import fr.insarennes.nperier.minichamo.language.typing.unification.UnificationMapper; import fr.insarennes.nperier.minichamo.language.typing.unification.UnificationMapper;
import fr.insarennes.nperier.minichamo.language.typing.visitor.TypeVisitor; import fr.insarennes.nperier.minichamo.language.typing.visitor.TypeVisitor;
import fr.insarennes.nperier.minichamo.lexing.tokens.NameToken;
import fr.insarennes.nperier.minichamo.lexing.tokens.Token; import fr.insarennes.nperier.minichamo.lexing.tokens.Token;
import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType; import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType;
import fr.insarennes.nperier.minichamo.errors.ParsingException; import fr.insarennes.nperier.minichamo.errors.ParsingException;
...@@ -105,7 +108,7 @@ public class TypeParser { ...@@ -105,7 +108,7 @@ public class TypeParser {
return GenericType.fromToken(token); return GenericType.fromToken(token);
} }
if(token.getType() == TokenType.NAME) { if(token.getType() == TokenType.NAME) {
String name = ((NameToken) token).getString(); String name = token.getString();
if(ctx.hasUserType(name)) { if(ctx.hasUserType(name)) {
return ctx.getUserType(name); return ctx.getUserType(name);
} }
......
...@@ -4,7 +4,6 @@ import fr.insarennes.nperier.minichamo.language.definition.TypeDef; ...@@ -4,7 +4,6 @@ import fr.insarennes.nperier.minichamo.language.definition.TypeDef;
import fr.insarennes.nperier.minichamo.language.typing.GenericType; import fr.insarennes.nperier.minichamo.language.typing.GenericType;
import fr.insarennes.nperier.minichamo.language.typing.SumType; import fr.insarennes.nperier.minichamo.language.typing.SumType;
import fr.insarennes.nperier.minichamo.language.typing.Type; import fr.insarennes.nperier.minichamo.language.typing.Type;
import fr.insarennes.nperier.minichamo.lexing.tokens.NameToken;
import fr.insarennes.nperier.minichamo.lexing.tokens.Token; import fr.insarennes.nperier.minichamo.lexing.tokens.Token;
import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType; import fr.insarennes.nperier.minichamo.lexing.tokens.TokenType;
import fr.insarennes.nperier.minichamo.lexing.tokens.TypeToken; import fr.insarennes.nperier.minichamo.lexing.tokens.TypeToken;
...@@ -33,7 +32,7 @@ public class TypedefParser { ...@@ -33,7 +32,7 @@ public class TypedefParser {
if(next.getType() != TokenType.NAME) { if(next.getType() != TokenType.NAME) {
throw new ParsingException("Expected identifier during type definition", next); throw new ParsingException("Expected identifier during type definition", next);
} }
String name = ((NameToken) next).getString(); String name = next.getString();
if(!it.junkIf(TokenType.EQUAL)) { if(!it.junkIf(TokenType.EQUAL)) {
throw new ParsingException("Expected equal symbol during type definition", next); throw new ParsingException("Expected equal symbol during type definition", next);
} }
...@@ -82,8 +81,7 @@ public class TypedefParser { ...@@ -82,8 +81,7 @@ public class TypedefParser {
if(it.peek().getType() != TokenType.CONSTRUCT_NAME) { if(it.peek().getType() != TokenType.CONSTRUCT_NAME) {
throw new ParsingException("Expected constructor name in sum type definition", it.peek()); throw new ParsingException("Expected constructor name in sum type definition", it.peek());
} }
NameToken next = (NameToken) it.next(); String name = it.next().getString();
String name = next.getString();
if(it.peek().getType() == TokenType.OF) { if(it.peek().getType() == TokenType.OF) {
it.junk(); it.junk();
t.addConstructor(name, TypeParser.parse(it, ctx)); t.addConstructor(name, TypeParser.parse(it, ctx));
......