Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/main/java/AST.java
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
public abstract class AST {
import javaslang.render.ToTree;

public abstract class AST implements ToTree<String>{
public abstract int maxargs();
}
19 changes: 19 additions & 0 deletions src/main/java/AssignStm.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import javaslang.collection.Tree;

import java.util.Map;

public class AssignStm extends Stm {

public final String id;
Expand All @@ -15,4 +19,19 @@ public String toString() {
", exp=" + exp +
'}';
}

@Override
public Tree.Node<String> toTree() {
return Tree.of("AssignStm", Tree.of(id), exp.toTree());
}

@Override
public int maxargs() {
return exp.maxargs();
}

@Override
public void interp(Map<String, Integer> mem) {
mem.put(id, exp.eval(mem));
}
}
20 changes: 20 additions & 0 deletions src/main/java/CompoundStm.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import javaslang.collection.Tree;

import java.util.Map;

public class CompoundStm extends Stm {

public final Stm stm1;
Expand All @@ -15,4 +19,20 @@ public String toString() {
", stm2=" + stm2 +
'}';
}

@Override
public Tree.Node<String> 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<String, Integer> mem) {
stm1.interp(mem);
stm2.interp(mem);
}
}
20 changes: 20 additions & 0 deletions src/main/java/EseqExp.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import javaslang.collection.Tree;

import java.util.Map;

public class EseqExp extends Exp {

public final Stm stm;
Expand All @@ -15,4 +19,20 @@ public String toString() {
", exp=" + exp +
'}';
}

@Override
public Tree.Node<String> 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<String, Integer> mem) {
stm.interp(mem);
return exp.eval(mem);
}
}
4 changes: 4 additions & 0 deletions src/main/java/Exp.java
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
import javaslang.collection.Tree;
import java.util.Map;

public abstract class Exp extends AST {
public abstract Integer eval(Map<String, Integer> mem);
}
20 changes: 20 additions & 0 deletions src/main/java/IdExp.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import javaslang.collection.Tree;

import java.util.Map;

public class IdExp extends Exp {
public final String id;

Expand All @@ -11,4 +15,20 @@ public String toString() {
"id='" + id + '\'' +
'}';
}

@Override
public Tree.Node<String> toTree() {
return Tree.of("IdExp " + id);
}

@Override
public int maxargs() {
return 0;
}

@Override
public Integer eval(Map<String, Integer> mem) {
Integer x = mem.get(id);
return x == null ? 0 : x;
}
}
10 changes: 10 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -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 {

Expand All @@ -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<String, Integer>());
}
}
20 changes: 20 additions & 0 deletions src/main/java/NumExp.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import javaslang.collection.Tree;

import java.util.Map;

public class NumExp extends Exp {
public final int num;

Expand All @@ -11,4 +15,20 @@ public String toString() {
"num=" + num +
'}';
}

@Override
public Tree.Node<String> toTree() {
return Tree.of("NumExp " + num);
}

@Override
public int maxargs() {
return 0;
}

@Override
public Integer eval(Map<String, Integer> mem) {
return num;
}
}

29 changes: 29 additions & 0 deletions src/main/java/OpExp.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import javaslang.collection.Tree;

import java.util.Map;

public class OpExp extends Exp {

public enum Op { PLUS, MINUS, TIMES, DIV }
Expand All @@ -20,4 +24,29 @@ public String toString() {
", op=" + op +
'}';
}

@Override
public Tree.Node<String> 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<String, Integer> 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;

}
}
}
25 changes: 25 additions & 0 deletions src/main/java/PrintStm.java
Original file line number Diff line number Diff line change
@@ -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 {

Expand All @@ -14,4 +18,25 @@ public String toString() {
"exps=" + exps +
'}';
}

@Override
public Tree.Node<String> 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<String, Integer> mem) {
exps.forEach(e -> System.out.println(e.eval(mem) + " "));
System.out.println();
}
}
4 changes: 4 additions & 0 deletions src/main/java/Stm.java
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
import java.util.Map;

public abstract class Stm extends AST {
public abstract void interp(Map<String, Integer> mem);

}
20 changes: 20 additions & 0 deletions straightline.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.5" level="project" />
<orderEntry type="library" name="Maven: io.javaslang:javaslang:2.0.6" level="project" />
<orderEntry type="library" name="Maven: io.javaslang:javaslang-match:2.0.6" level="project" />
<orderEntry type="library" name="Maven: io.javaslang:javaslang-render:2.0.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.7.0" level="project" />
</component>
</module>