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 {
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);
}
}
......@@ -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.GenericType;
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.utils.Counter;
import fr.insarennes.nperier.minichamo.errors.ParsingException;
......@@ -60,7 +59,7 @@ public class DefinitionParser {
public static FunctionDef parseRecursiveFunction(TokenPeekIterator it, Context ctx, SymbolPosition pos) {
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);
}
......
......@@ -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.TokenPeekIterator;
import java.util.List;
import java.util.Optional;
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) {
return parse(it, ctx, new Counter());
}
......
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.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.TokenType;
import fr.insarennes.nperier.minichamo.errors.ParsingException;
......@@ -105,7 +108,7 @@ public class TypeParser {
return GenericType.fromToken(token);
}
if(token.getType() == TokenType.NAME) {
String name = ((NameToken) token).getString();
String name = token.getString();
if(ctx.hasUserType(name)) {
return ctx.getUserType(name);
}
......
......@@ -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.SumType;
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.TokenType;
import fr.insarennes.nperier.minichamo.lexing.tokens.TypeToken;
......@@ -33,7 +32,7 @@ public class TypedefParser {
if(next.getType() != TokenType.NAME) {
throw new ParsingException("Expected identifier during type definition", next);
}
String name = ((NameToken) next).getString();
String name = next.getString();
if(!it.junkIf(TokenType.EQUAL)) {
throw new ParsingException("Expected equal symbol during type definition", next);
}
......@@ -82,8 +81,7 @@ public class TypedefParser {
if(it.peek().getType() != TokenType.CONSTRUCT_NAME) {
throw new ParsingException("Expected constructor name in sum type definition", it.peek());
}
NameToken next = (NameToken) it.next();
String name = next.getString();
String name = it.next().getString();
if(it.peek().getType() == TokenType.OF) {
it.junk();
t.addConstructor(name, TypeParser.parse(it, ctx));
......