diff --git a/src/main/java/AST.java b/src/main/java/AST.java index 7ed4bb6..24ce6e4 100644 --- a/src/main/java/AST.java +++ b/src/main/java/AST.java @@ -1,2 +1,5 @@ -public abstract class AST { +import javaslang.render.ToTree; + +public abstract class AST implements ToTree{ + public abstract int maxargs(); } diff --git a/src/main/java/AssignStm.java b/src/main/java/AssignStm.java index d9d1a6e..ba392c5 100644 --- a/src/main/java/AssignStm.java +++ b/src/main/java/AssignStm.java @@ -1,3 +1,7 @@ +import javaslang.collection.Tree; + +import java.util.Map; + public class AssignStm extends Stm { public final String id; @@ -15,4 +19,19 @@ public String toString() { ", exp=" + exp + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("AssignStm", Tree.of(id), exp.toTree()); + } + + @Override + public int maxargs() { + return exp.maxargs(); + } + + @Override + public void interp(Map mem) { + mem.put(id, exp.eval(mem)); + } } diff --git a/src/main/java/CompoundStm.java b/src/main/java/CompoundStm.java index f566e4d..c15352a 100644 --- a/src/main/java/CompoundStm.java +++ b/src/main/java/CompoundStm.java @@ -1,3 +1,7 @@ +import javaslang.collection.Tree; + +import java.util.Map; + public class CompoundStm extends Stm { public final Stm stm1; @@ -15,4 +19,20 @@ public String toString() { ", stm2=" + stm2 + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("CompoundStm", stm1.toTree(), stm2.toTree()); + } + + @Override + public int maxargs() { + return Math.max(stm1.maxargs(), stm2.maxargs()); + } + + @Override + public void interp(Map mem) { + stm1.interp(mem); + stm2.interp(mem); + } } diff --git a/src/main/java/EseqExp.java b/src/main/java/EseqExp.java index a9902cf..7048745 100644 --- a/src/main/java/EseqExp.java +++ b/src/main/java/EseqExp.java @@ -1,3 +1,7 @@ +import javaslang.collection.Tree; + +import java.util.Map; + public class EseqExp extends Exp { public final Stm stm; @@ -15,4 +19,20 @@ public String toString() { ", exp=" + exp + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("EseqExp", stm.toTree(), exp.toTree()); + } + + @Override + public int maxargs() { + return Math.max(stm.maxargs(), exp.maxargs()); + } + + @Override + public Integer eval(Map mem) { + stm.interp(mem); + return exp.eval(mem); + } } diff --git a/src/main/java/Exp.java b/src/main/java/Exp.java index 4dd4145..e1cc0a4 100644 --- a/src/main/java/Exp.java +++ b/src/main/java/Exp.java @@ -1,2 +1,6 @@ +import javaslang.collection.Tree; +import java.util.Map; + public abstract class Exp extends AST { + public abstract Integer eval(Map mem); } diff --git a/src/main/java/IdExp.java b/src/main/java/IdExp.java index 32ba2df..684b4ad 100644 --- a/src/main/java/IdExp.java +++ b/src/main/java/IdExp.java @@ -1,3 +1,7 @@ +import javaslang.collection.Tree; + +import java.util.Map; + public class IdExp extends Exp { public final String id; @@ -11,4 +15,20 @@ public String toString() { "id='" + id + '\'' + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("IdExp " + id); + } + + @Override + public int maxargs() { + return 0; + } + + @Override + public Integer eval(Map mem) { + Integer x = mem.get(id); + return x == null ? 0 : x; + } } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 24a7a0d..4efb10b 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,4 +1,8 @@ import javaslang.collection.List; +import javaslang.render.text.Box; +import javaslang.render.text.Boxes; + +import java.util.HashMap; public class Main { @@ -13,6 +17,12 @@ public static void main(String[] args) { new PrintStm(List.of(new IdExp("x")))); System.out.println(p); + System.out.println(p.toTree().draw()); + System.out.println(Boxes.box(p.toTree())); + + System.out.printf("maxargs: %d%n", p.maxargs()); + System.out.println("Execução: "); + p.interp(new HashMap()); } } diff --git a/src/main/java/NumExp.java b/src/main/java/NumExp.java index 1e070b9..5566d74 100644 --- a/src/main/java/NumExp.java +++ b/src/main/java/NumExp.java @@ -1,3 +1,7 @@ +import javaslang.collection.Tree; + +import java.util.Map; + public class NumExp extends Exp { public final int num; @@ -11,4 +15,20 @@ public String toString() { "num=" + num + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("NumExp " + num); + } + + @Override + public int maxargs() { + return 0; + } + + @Override + public Integer eval(Map mem) { + return num; + } } + diff --git a/src/main/java/OpExp.java b/src/main/java/OpExp.java index a25cf35..5e27b60 100644 --- a/src/main/java/OpExp.java +++ b/src/main/java/OpExp.java @@ -1,3 +1,7 @@ +import javaslang.collection.Tree; + +import java.util.Map; + public class OpExp extends Exp { public enum Op { PLUS, MINUS, TIMES, DIV } @@ -20,4 +24,29 @@ public String toString() { ", op=" + op + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("OpExp " + op, left.toTree(), right.toTree()); + } + + @Override + public int maxargs() { + return Math.max(left.maxargs(), right.maxargs()); + } + + @Override + public Integer eval(Map mem) { + Integer x = left.eval(mem); + Integer y = right.eval(mem); + + switch (op){ + case PLUS: return x + y; + case MINUS: return x - y; + case TIMES: return x * y; + case DIV: return x/y; + default: return 0; + + } + } } diff --git a/src/main/java/PrintStm.java b/src/main/java/PrintStm.java index ba730ef..fc7f869 100644 --- a/src/main/java/PrintStm.java +++ b/src/main/java/PrintStm.java @@ -1,4 +1,8 @@ import javaslang.collection.List; +import javaslang.collection.Tree; +import javaslang.render.ToTree; + +import java.util.Map; public class PrintStm extends Stm { @@ -14,4 +18,25 @@ public String toString() { "exps=" + exps + '}'; } + + @Override + public Tree.Node toTree() { + return Tree.of("PrintStm", exps.map(Exp::toTree)); + } + + @Override + public int maxargs() { + int aux = exps.length(); + + for(Exp e : exps) + aux = Math.max(e.maxargs(), aux); + + return exps.length(); + } + + @Override + public void interp(Map mem) { + exps.forEach(e -> System.out.println(e.eval(mem) + " ")); + System.out.println(); + } } diff --git a/src/main/java/Stm.java b/src/main/java/Stm.java index d406e8b..288a2b5 100644 --- a/src/main/java/Stm.java +++ b/src/main/java/Stm.java @@ -1,2 +1,6 @@ +import java.util.Map; + public abstract class Stm extends AST { + public abstract void interp(Map mem); + } diff --git a/straightline.iml b/straightline.iml new file mode 100644 index 0000000..993e87b --- /dev/null +++ b/straightline.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file