summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd-912 <bdunahu@colostate.edu>2024-04-08 00:07:44 -0600
committerbd-912 <bdunahu@colostate.edu>2024-04-08 00:07:44 -0600
commit0de1debf8b72c460d6974de8a8ab9cbbdeecb160 (patch)
tree8f12392fbc7f287089cc2bf393e443a3e44ecded
parentc3d4ff012c568a50e3403caf040de704bc201101 (diff)
J2V works for simple examples
-rw-r--r--st/SymbolTable.java20
-rw-r--r--vapor.jarbin0 -> 110015 bytes
-rw-r--r--vaporize/library/TypeFactory.java25
-rw-r--r--vaporize/library/VaporizeSimp.java61
-rw-r--r--vaporize/tests_easy/ex29.java5
-rw-r--r--vaporize/tests_easy/ex30.java11
-rw-r--r--vaporize/tests_easy/ex31.java12
7 files changed, 113 insertions, 21 deletions
diff --git a/st/SymbolTable.java b/st/SymbolTable.java
index 7475e5e..d0ea221 100644
--- a/st/SymbolTable.java
+++ b/st/SymbolTable.java
@@ -37,14 +37,6 @@ public class SymbolTable {
/**
* Methods intended to be used during the second pass
*/
- public void setActive(TypeEnum type, String id) {
- this.active.put(type, id);
- }
-
- public void removeActive(TypeEnum type) {
- this.active.remove(type);
- }
-
public void setExtend(String arg) {
String str = this.active.get(TypeEnum.classname);
ClassInstance cls = this.getClass(str);
@@ -93,6 +85,14 @@ public class SymbolTable {
* Methods to safely retrieve differentiable types
* in `typecheck', `vaporize' libraries
*/
+ public void setActive(TypeEnum type, String id) {
+ this.active.put(type, id);
+ }
+
+ public void removeActive(TypeEnum type) {
+ this.active.remove(type);
+ }
+
public TypeInstance getType(String id) {
AbstractInstance symbol;
return ((symbol = this.symt.get(id)) !=
@@ -114,4 +114,8 @@ public class SymbolTable {
(ClassInstance) symbol : null;
}
+ public String getActive(TypeEnum type) {
+ return this.active.get(type);
+ }
+
}
diff --git a/vapor.jar b/vapor.jar
new file mode 100644
index 0000000..3ffd591
--- /dev/null
+++ b/vapor.jar
Binary files differ
diff --git a/vaporize/library/TypeFactory.java b/vaporize/library/TypeFactory.java
new file mode 100644
index 0000000..0166e3c
--- /dev/null
+++ b/vaporize/library/TypeFactory.java
@@ -0,0 +1,25 @@
+package vaporize.library;
+
+import java.util.HashMap;
+import st.TypeInstance;
+
+public class TypeFactory {
+
+ private int type_num;
+ private HashMap<TypeInstance,String> map;
+
+ public void reset() {
+ this.type_num = 0;
+ this.map = new HashMap<>();
+ }
+
+ public String addNewAlias(TypeInstance t) {
+ String alias = String.format("t.%d", type_num);
+ this.map.put(t, alias);
+ return alias;
+ }
+
+ public String retrieveAlias(TypeInstance t) {
+ return this.map.get(t);
+ }
+}
diff --git a/vaporize/library/VaporizeSimp.java b/vaporize/library/VaporizeSimp.java
index fa026c0..44121a9 100644
--- a/vaporize/library/VaporizeSimp.java
+++ b/vaporize/library/VaporizeSimp.java
@@ -8,6 +8,8 @@ import java.util.*;
public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
+ TypeFactory tf = new TypeFactory();
+
//
// Auto class visitors--probably don't need to be overridden.
//
@@ -92,6 +94,11 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
* f17 -> "}"
*/
public String visit(MainClass n, SymbolTable symt) {
+ String id = n.f1.f0.tokenImage;
+
+ symt.setActive(TypeEnum.classname, id);
+ symt.setActive(TypeEnum.method, "main");
+ this.tf.reset();
String mod = "";
mod += "func Main()\n";
@@ -109,12 +116,16 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
n.f11.accept(this, symt); // throw boiler 'args' variable away
mod += n.f12.accept(this, symt);
mod += n.f13.accept(this, symt);
- n.f14.accept(this, symt); // FIXME
+ mod += n.f14.accept(this, symt); // FIXME
mod += n.f15.accept(this, symt);
mod += n.f16.accept(this, symt);
mod += n.f17.accept(this, symt);
- mod += " ret\n\n";
+ mod += " goto :exit\nerror:\n" +
+ " Error(\"Mem exhausted\")\n goto :exit\n" +
+ "exit:\n ret\n\n";
+
+ symt.removeActive(TypeEnum.method);
return mod;
}
@@ -137,12 +148,15 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
* f5 -> "}"
*/
public String visit(ClassDeclaration n, SymbolTable symt) {
+ String id = n.f1.f0.tokenImage;
+ symt.setActive(TypeEnum.classname, id);
String mod = "";
+
mod += n.f0.accept(this, symt);
- String id= n.f1.accept(this, symt);
- mod += "const functable_" + id + "\n";
+ n.f1.accept(this, symt);
+ mod += String.format("const functable_%s\n", id);
for (MethodInstance mtd : symt.getClass(id).getMethods()) {
- mod += " :" + id + "_" + mtd + "\n";
+ mod += String.format(" :%s_%s\n", id, mtd);
}
mod += "\n";
mod += n.f2.accept(this, symt);
@@ -164,7 +178,10 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
* f7 -> "}"
*/
public String visit(ClassExtendsDeclaration n, SymbolTable symt) {
+ String id = n.f1.f0.tokenImage;
+ symt.setActive(TypeEnum.classname, id);
String mod = "";
+
mod += n.f0.accept(this, symt);
mod += n.f1.accept(this, symt);
mod += n.f2.accept(this, symt);
@@ -183,8 +200,13 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
*/
public String visit(VarDeclaration n, SymbolTable symt) {
String mod = "";
- mod += n.f0.accept(this, symt);
- mod += n.f1.accept(this, symt);
+
+ n.f0.accept(this, symt);
+ String id = n.f1.accept(this, symt);
+ mod += String.format(" %s = HeapAllocZ(32)\n",
+ this.tf.addNewAlias(symt.getType(id))); // FIXME add proper allocation size
+ mod += String.format(" if0 %s goto :error\n",
+ this.tf.retrieveAlias(symt.getType(id)));
mod += n.f2.accept(this, symt);
return mod;
}
@@ -205,12 +227,16 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
* f12 -> "}"
*/
public String visit(MethodDeclaration n, SymbolTable symt) {
+ String id = n.f2.f0.tokenImage;
+ symt.setActive(TypeEnum.method, id);
+ this.tf.reset();
String mod = "";
+
mod += n.f0.accept(this, symt);
mod += n.f1.accept(this, symt);
- String id = n.f2.accept(this, symt);
- mod += "func " + id; //FIXME After ST properly handles scoping
- mod += n.f3.accept(this, symt);
+ n.f2.accept(this, symt);
+ mod += "func " + symt.getActive(TypeEnum.classname) + "_" + id + "(this)\n";
+ mod += n.f3.accept(this, symt);
mod += n.f4.accept(this, symt);
mod += n.f5.accept(this, symt);
mod += n.f6.accept(this, symt);
@@ -220,6 +246,11 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
mod += n.f10.accept(this, symt);
mod += n.f11.accept(this, symt);
mod += n.f12.accept(this, symt);
+
+ mod += " ret\n\n";
+
+
+ symt.removeActive(TypeEnum.method);
return mod;
}
@@ -334,7 +365,9 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
*/
public String visit(AssignmentStatement n, SymbolTable symt) {
String mod = "";
- mod += n.f0.accept(this, symt);
+
+ String id = n.f0.accept(this, symt);
+ mod += String.format(" [%s] = ", this.tf.retrieveAlias(symt.getType(id)));
mod += n.f1.accept(this, symt);
mod += n.f2.accept(this, symt);
mod += n.f3.accept(this, symt);
@@ -352,7 +385,7 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
*/
public String visit(ArrayAssignmentStatement n, SymbolTable symt) {
String mod = "";
- mod += n.f0.accept(this, symt);
+ n.f0.accept(this, symt);
mod += n.f1.accept(this, symt);
mod += n.f2.accept(this, symt);
mod += n.f3.accept(this, symt);
@@ -656,7 +689,9 @@ public class VaporizeSimp extends GJDepthFirst<String,SymbolTable> {
public String visit(AllocationExpression n, SymbolTable symt) {
String mod = "";
mod += n.f0.accept(this, symt);
- mod += n.f1.accept(this, symt);
+ String cls = n.f1.accept(this, symt);
+ mod += String.format(":functable_%s\n", cls);
+
mod += n.f2.accept(this, symt);
mod += n.f3.accept(this, symt);
return mod;
diff --git a/vaporize/tests_easy/ex29.java b/vaporize/tests_easy/ex29.java
new file mode 100644
index 0000000..30ea154
--- /dev/null
+++ b/vaporize/tests_easy/ex29.java
@@ -0,0 +1,5 @@
+class ex29 {
+ public static void main(String[] a) {
+ int x ;
+ }
+}
diff --git a/vaporize/tests_easy/ex30.java b/vaporize/tests_easy/ex30.java
new file mode 100644
index 0000000..4a5064d
--- /dev/null
+++ b/vaporize/tests_easy/ex30.java
@@ -0,0 +1,11 @@
+class ex30 {
+ public static void main(String[] a) {
+ int x ;
+ }
+}
+
+class A {
+ public int foo() {
+ return 22 ;
+ }
+}
diff --git a/vaporize/tests_easy/ex31.java b/vaporize/tests_easy/ex31.java
new file mode 100644
index 0000000..6527b8b
--- /dev/null
+++ b/vaporize/tests_easy/ex31.java
@@ -0,0 +1,12 @@
+class ex31 {
+ public static void main(String[] a) {
+ A a ;
+ a = new A() ;
+ }
+}
+
+class A {
+ public int foo() {
+ return 22 ;
+ }
+}