diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-26 15:50:38 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-26 15:50:38 -0600 |
commit | 1851f5e76018ec1df3b55dce6cc9a64c9497bf7a (patch) | |
tree | 30f629f7b137a494d4202487f4e22df2d9456481 /vaporize/Kettle.java | |
parent | 012298517078170762112abe2654dc69b2f146e1 (diff) |
Rearrange directory structure
Diffstat (limited to 'vaporize/Kettle.java')
-rw-r--r-- | vaporize/Kettle.java | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/vaporize/Kettle.java b/vaporize/Kettle.java new file mode 100644 index 0000000..4d7a3db --- /dev/null +++ b/vaporize/Kettle.java @@ -0,0 +1,116 @@ +package vaporize; + +import cs132.vapor.ast.*; +import misc.*; + +import java.util.ArrayList; + +/** + * This class contains various generic methods for + * assembling common-use vaporm strings and managing + * the original input program. + * + * Robert Martin cries + */ +class Kettle { + + ArrayList<String> vapor; + ArrayList<String> vaporm; + + protected Kettle(ArrayList<String> vapor) { + MinimalLogger.info("Pouring program into kettle..."); + this.vapor = vapor; + this.vaporm = new ArrayList<String>(); + } + + protected String get(Node n) { + /** + * Given the source position of a Node, returns the original line. + */ + return this.vapor.get(this.indexOf(n)); + } + + protected void replaceFunctionDeclare(VFunction prev, int in, + int out, int local) { + /** + * Replaces a function declaraction in the program + * with the vapor equivalent. + */ + String next = String.format("func %s [in %d, out %d, local %d]", + this.parseFuncName(prev), + in, + out, + local); + + MinimalLogger.info(String.format("Replacing function declaraction %s with %s", + this.get(prev), + next)); + + this.set(prev, next); + } + + protected String parseFuncName(VFunction func) { + /** + * Helper for replaceFunctionDeclare + * "func A_foo(this t.1)" -> "A_foo" + */ + String str = this.get(func); + int openParenIndex = str.indexOf('('); + return str.substring(5, openParenIndex).trim(); + } + + protected String spill() { + return null; + } + + protected String backup() { + return null; + } + + protected String dump() { + return String.join("\n", this.vapor); + } + + private void set(Node n, String s) { + /** + * Sets the position of Node n in the original + * file to String s. + */ + this.vapor.set(this.indexOf(n), s); + } + + protected int indexOf(Node n) { + return n.sourcePos.line-1; + } + + // METHODS INTENDED TO BE USED WITH CFG + + /** + * Needed because VBranch doesn't seem to + * keep track of this... + */ + protected int findLabelIndex(String str) { + int index = -3; + // is this guarenteed? + String search = str.substring(1); + String comp; + for (int i = 0; i < this.vapor.size(); ++i) { + if (!this.vapor.get(i).isEmpty()) { + comp = this.vapor.get(i).trim(); + if (comp.substring(0, comp.length()-1) + .equals(search)) { + index = i; + break; + } + } + } + + if (index == -3) { + MinimalLogger.severe(String.format("findLabelIndex could not compute label for %s!", + str.trim())); + } + // go to the section AFTER the label, and account for starting at zero + return index+2; + } + +} |