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

Added the rest of the code

parent e3006828
No related branches found
No related tags found
No related merge requests found
Showing
with 238 additions and 28 deletions
......@@ -6,7 +6,7 @@
<groupId>fr.insarennes.nperier</groupId>
<artifactId>minichamo</artifactId>
<version>1.0-SNAPSHOT</version>
<version>0.7</version>
<build>
<plugins>
......@@ -19,6 +19,20 @@
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fr.insarennes.nperier.minichamo.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
......
package fr.insarennes.nperier.minichamo.language.definition;
import fr.insarennes.nperier.minichamo.language.Context;
import fr.insarennes.nperier.minichamo.language.assignement.param.VarParam;
import fr.insarennes.nperier.minichamo.language.expressions.Expression;
import fr.insarennes.nperier.minichamo.language.typing.FunctionType;
import fr.insarennes.nperier.minichamo.language.typing.GenericType;
import fr.insarennes.nperier.minichamo.language.typing.Type;
......@@ -10,6 +12,7 @@ import fr.insarennes.nperier.minichamo.utils.SymbolPosition;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class FunctionDef extends VariableDef {
......@@ -37,6 +40,24 @@ public class FunctionDef extends VariableDef {
return this;
}
@Override
public Type getType() {
List<Type> sp = new ArrayList<>();
for(VarParam p : params) {
sp.add(p.getType());
}
sp.add(expr.getType());
return new FunctionType(sp);
}
@Override
public void setExpression(final Expression e) {
expr = e;
Type effective = e.getType();
Map<String, Type> mapping = Type.unifyTwoMapping(returnType, effective);
replaceTypes(new ReplaceGenericsVisitor(mapping));
}
public boolean isRecursive() {
return recursive;
}
......@@ -49,6 +70,10 @@ public class FunctionDef extends VariableDef {
return params;
}
public VarParam getParam(int i) {
return params.get(i);
}
public Type getReturnType() {
return returnType;
}
......@@ -64,6 +89,7 @@ public class FunctionDef extends VariableDef {
for(VarParam p : params) {
sp.add(p.getType());
}
sp.add(returnType);
return new FunctionType(sp);
}
......@@ -80,6 +106,11 @@ public class FunctionDef extends VariableDef {
return new FunctionDef(this);
}
@Override
public VariableDef evalIfPossible(Context ctx) {
return this;
}
@Override
public boolean equals(Object o) {
if(!(o instanceof FunctionDef)) {
......
package fr.insarennes.nperier.minichamo.language.definition;
import fr.insarennes.nperier.minichamo.language.Context;
import fr.insarennes.nperier.minichamo.language.expressions.Expression;
import fr.insarennes.nperier.minichamo.language.typing.Type;
import fr.insarennes.nperier.minichamo.language.typing.visitor.ReplaceGenericsVisitor;
import fr.insarennes.nperier.minichamo.language.typing.visitor.TypeVisitor;
import fr.insarennes.nperier.minichamo.utils.SymbolPosition;
......@@ -14,11 +15,21 @@ public class ValueDef extends VariableDef {
type = t;
}
public ValueDef(String n, Expression e) {
super(n, null);
expr = e;
}
public ValueDef(ValueDef vd) {
super(vd);
type = vd.type;
}
@Override
public Type getType() {
return expr.getType();
}
@Override
protected Type getDeclaredType() {
return type;
......@@ -34,6 +45,12 @@ public class ValueDef extends VariableDef {
return new ValueDef(this);
}
@Override
public VariableDef evalIfPossible(Context ctx) {
setExpression(expr.evaluate(ctx));
return this;
}
@Override
protected void nameToDisplay(StringBuilder builder, String indent) {
builder.append("let ").append(name).append(" : ").append(type);
......
package fr.insarennes.nperier.minichamo.language.definition;
import fr.insarennes.nperier.minichamo.language.Context;
import fr.insarennes.nperier.minichamo.language.expressions.Expression;
import fr.insarennes.nperier.minichamo.language.typing.Type;
import fr.insarennes.nperier.minichamo.language.typing.visitor.ReplaceGenericsVisitor;
......@@ -13,7 +14,7 @@ import java.util.*;
public abstract class VariableDef implements Displayable, Positioned {
protected final String name;
private Expression expr;
protected Expression expr;
private final List<NestedDefinition> nested;
protected final SymbolPosition pos;
......@@ -76,12 +77,16 @@ public abstract class VariableDef implements Displayable, Positioned {
getExpression().replaceTypes(visitor);
}
abstract public Type getType();
abstract public void completeDeclaredType(TypeVisitor<Type> visitor);
abstract protected void nameToDisplay(StringBuilder builder, String indent);
abstract public VariableDef duplicate();
abstract public VariableDef evalIfPossible(Context ctx);
abstract protected Type getDeclaredType();
@Override
......
......@@ -68,6 +68,11 @@ public class ConditionExpression extends Expression {
return condition.isComplex() || yes.isComplex() || no.isComplex();
}
@Override
public boolean isSeveralWords() {
return true;
}
@Override
public void toDisplay(StringBuilder builder, String indent) {
if(isComplex()) {
......
package fr.insarennes.nperier.minichamo.language.expressions;
public class ConstructorExpression {
}
......@@ -21,6 +21,8 @@ public abstract class Expression implements Displayable {
public abstract boolean isComplex();
public abstract boolean isSeveralWords();
public Expression duplicate() {
return acceptVisitor(new DuplicateExpressionVisitor());
}
......
package fr.insarennes.nperier.minichamo.language.expressions;
import fr.insarennes.nperier.minichamo.language.Context;
import fr.insarennes.nperier.minichamo.language.definition.FunctionDef;
import fr.insarennes.nperier.minichamo.language.definition.ValueDef;
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.FunctionType;
import fr.insarennes.nperier.minichamo.language.typing.Type;
import java.util.ArrayList;
import java.util.List;
public class FunctionCallExpression extends Expression {
private final FunctionDef fun;
private final List<Expression> args;
public FunctionCallExpression(final FunctionDef f, final List<Expression> el) {
fun = f;
args = new ArrayList<>(el);
// TODO unification
}
public FunctionDef getFunction() {
return fun;
}
public List<Expression> getArgs() {
return args;
}
@Override
public Expression evaluate(Context ctx) {
Context ctx1 = ctx.duplicate();
for(int i = 0; i < fun.getNbParams(); i++) {
Expression val = args.get(i).evaluate(ctx);
String n = fun.getParam(i).getVar();
ctx1.addVariable(new ValueDef(n, val));
}
return fun.getExpression().evaluate(ctx1);
}
@Override
public Type getType() {
List<Type> sp = new ArrayList<>();
for(Expression arg : args) {
sp.add(arg.getType());
}
sp.add(fun.getReturnType());
return new FunctionType(sp);
}
@Override
public <T> T acceptVisitor(ExpressionVisitor<T> visitor) {
return null;
}
@Override
public <V, T> T acceptVisitor(ExpressionArgVisitor<V, T> visitor, V arg) {
return null;
}
@Override
public boolean isComplex() {
return args.stream().anyMatch(Expression::isComplex);
}
@Override
public boolean isSeveralWords() {
return true;
}
@Override
public void toDisplay(StringBuilder builder, String indent) {
builder.append(fun.getName());
for(Expression e : args) {
builder.append(" ");
if(e.isSeveralWords()) {
builder.append("(");
e.toDisplay(builder, indent);
builder.append(")");
} else {
e.toDisplay(builder, indent);
}
}
}
}
package fr.insarennes.nperier.minichamo.language.expressions;
public class MatchExpression {
}
......@@ -72,6 +72,11 @@ public class NameExpression extends Expression {
return false;
}
@Override
public boolean isSeveralWords() {
return false;
}
@Override
public void toDisplay(StringBuilder builder, String indent) {
builder.append(name);
......
......@@ -35,12 +35,12 @@ public class NupleExpression extends Expression {
@Override
public <T> T acceptVisitor(ExpressionVisitor<T> visitor) {
return null;
return visitor.visitNuple(this);
}
@Override
public <V, T> T acceptVisitor(ExpressionArgVisitor<V, T> visitor, V arg) {
return null;
return visitor.visitNuple(this, arg);
}
@Override
......@@ -48,25 +48,27 @@ public class NupleExpression extends Expression {
return streamElements().anyMatch(Expression::isComplex);
}
@Override
public boolean isSeveralWords() {
return true;
}
@Override
public void toDisplay(StringBuilder builder, String indent) {
if(isComplex()) {
String indent1 = indent + "\t";
builder.append("(\n").append(indent1);
builder.append("\n").append(indent1);
elts.get(0).toDisplay(builder, indent1);
for(int i = 1; i < elts.size(); i++) {
builder.append(",\n").append(indent1);
elts.get(i).toDisplay(builder, indent1);
}
builder.append("\n").append(indent).append(")");
};
} else {
builder.append("(");
elts.get(0).toDisplay(builder, indent);
for(int i = 1; i < elts.size(); i++) {
builder.append(", ");
elts.get(i).toDisplay(builder, indent);
}
builder.append(")");
}
}
}
package fr.insarennes.nperier.minichamo.language.expressions;
public class PartialFunctionCallExpression {
}
......@@ -28,7 +28,7 @@ public class VarExpression extends Expression {
@Override
public Type getType() {
return vard.getExpression().getType();
return vard.getType();
}
@Override
......@@ -55,6 +55,11 @@ public class VarExpression extends Expression {
return false;
}
@Override
public boolean isSeveralWords() {
return false;
}
@Override
public void toDisplay(StringBuilder builder, String indent) {
builder.append(vard.getName());
......
......@@ -27,6 +27,11 @@ public abstract class BaseExpression extends Expression {
return false;
}
@Override
public boolean isSeveralWords() {
return false;
}
@Override
public void toDisplay(StringBuilder builder, String indent) {
builder.append(toString());
......
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.definition.FunctionDef;
import fr.insarennes.nperier.minichamo.language.expressions.*;
import fr.insarennes.nperier.minichamo.language.expressions.base.BaseExpression;
......@@ -35,4 +36,12 @@ public class DuplicateExpressionVisitor extends SimpleExpressionVisitor<Expressi
public Expression visitNuple(NupleExpression e) {
return new NupleExpression(e.streamElements().map(elt -> elt.acceptVisitor(this)).collect(Collectors.toList()));
}
@Override
public Expression visitFunction(FunctionCallExpression e) {
return new FunctionCallExpression(
(FunctionDef) e.getFunction().duplicate(),
e.getArgs().stream().map(arg -> arg.acceptVisitor(this)).collect(Collectors.toList())
);
}
}
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.expressions.ConditionExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NameExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NupleExpression;
import fr.insarennes.nperier.minichamo.language.expressions.VarExpression;
import fr.insarennes.nperier.minichamo.language.expressions.*;
import fr.insarennes.nperier.minichamo.language.expressions.base.*;
public interface ExpressionArgVisitor<V,T> {
......@@ -28,4 +25,6 @@ public interface ExpressionArgVisitor<V,T> {
T visitNuple(NupleExpression e, V arg);
T visitFunction(FunctionCallExpression e, V arg);
}
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.expressions.ConditionExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NameExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NupleExpression;
import fr.insarennes.nperier.minichamo.language.expressions.VarExpression;
import fr.insarennes.nperier.minichamo.language.expressions.*;
import fr.insarennes.nperier.minichamo.language.expressions.base.*;
public interface ExpressionVisitor<T> {
......@@ -28,4 +25,6 @@ public interface ExpressionVisitor<T> {
T visitNuple(NupleExpression e);
T visitFunction(FunctionCallExpression e);
}
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.expressions.ConditionExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NameExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NupleExpression;
import fr.insarennes.nperier.minichamo.language.expressions.VarExpression;
import fr.insarennes.nperier.minichamo.language.assignement.param.VarParam;
import fr.insarennes.nperier.minichamo.language.expressions.*;
import fr.insarennes.nperier.minichamo.language.expressions.base.BaseExpression;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class GetNamesVisitor extends SimpleExpressionVisitor<Set<String>> {
......@@ -42,4 +41,12 @@ public class GetNamesVisitor extends SimpleExpressionVisitor<Set<String>> {
return res;
}
@Override
public Set<String> visitFunction(FunctionCallExpression e) {
final Set<String> res = new HashSet<>();
for(Expression arg : e.getArgs()) {
res.addAll(arg.acceptVisitor(this));
}
return res;
}
}
package fr.insarennes.nperier.minichamo.language.expressions.visitor;
import fr.insarennes.nperier.minichamo.language.expressions.ConditionExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NameExpression;
import fr.insarennes.nperier.minichamo.language.expressions.NupleExpression;
import fr.insarennes.nperier.minichamo.language.expressions.VarExpression;
import fr.insarennes.nperier.minichamo.language.expressions.*;
import fr.insarennes.nperier.minichamo.language.expressions.base.BaseExpression;
import fr.insarennes.nperier.minichamo.language.typing.Type;
import fr.insarennes.nperier.minichamo.language.typing.visitor.ReplaceGenericsVisitor;
......@@ -53,4 +50,11 @@ public class TypeReplacementVisitor extends SimpleExpressionVisitor<Void> {
e.streamElements().forEach(elt -> elt.acceptVisitor(this));
return null;
}
@Override
public Void visitFunction(FunctionCallExpression e) {
e.getArgs().forEach(arg -> arg.acceptVisitor(this));
e.getFunction().replaceTypes(visitor);
return null;
}
}
......@@ -29,7 +29,7 @@ public class AliasType extends Type {
}
@Override
public Type specify(Type[] sp) { // TODO propagate
public Type specify(Type[] sp) {
int arity = getArity();
if(sp.length != arity) {
throw new ParsingException("Alias type " + getName() + " has an arity of " + arity + " but got " + sp.length + " types");
......
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