|
@@ -2,6 +2,7 @@ package me.hammerle.code;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
+import java.util.Map.Entry;
|
|
|
import java.util.Stack;
|
|
|
import java.util.TreeSet;
|
|
|
import me.hammerle.exceptions.PrescriptException;
|
|
@@ -331,7 +332,8 @@ public class Code implements Comparable<Code>
|
|
|
continue;
|
|
|
}
|
|
|
s = code.substring(pos);
|
|
|
- if(s.startsWith(find) && !s.startsWith(find + "=") && code.charAt(pos - 1) != '=')
|
|
|
+ // Additionel check for e.g. difference between + and +=
|
|
|
+ if(s.startsWith(find) && !s.startsWith(find + "=") && code.charAt(pos - 1) != '=')
|
|
|
{
|
|
|
return pos;
|
|
|
}
|
|
@@ -445,10 +447,74 @@ public class Code implements Comparable<Code>
|
|
|
return new String(chars);
|
|
|
}
|
|
|
|
|
|
+ private static void keyWordBrackets(String keyWord, StringBuilder sb)
|
|
|
+ {
|
|
|
+ String with = keyWord + "()";
|
|
|
+ int length = keyWord.length();
|
|
|
+ int pos = 0;
|
|
|
+ while(true)
|
|
|
+ {
|
|
|
+ pos = findSyntax(keyWord, sb.toString(), pos);
|
|
|
+ if(pos == -1)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(!sb.substring(pos).startsWith(with))
|
|
|
+ {
|
|
|
+ sb.replace(pos, pos + length, with);
|
|
|
+ }
|
|
|
+ pos += length;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static Code[] generate(String code, HashMap<String, Integer> gotos)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
+ // Kommentare
|
|
|
+ int old = 0;
|
|
|
+ int pos;
|
|
|
+ StringBuilder sb = new StringBuilder(code);
|
|
|
+ while(true)
|
|
|
+ {
|
|
|
+ old = findSyntax("/*", sb.toString(), old);
|
|
|
+ if(old == -1)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ pos = findSyntax("*/", sb.toString(), old);
|
|
|
+ if(pos == -1)
|
|
|
+ {
|
|
|
+ throw new PrescriptException("/* without */", sb.substring(old, Math.min(old + 20, sb.length())));
|
|
|
+ }
|
|
|
+ sb.replace(old, pos + 2, "");
|
|
|
+ }
|
|
|
+ old = 0;
|
|
|
+ while(true)
|
|
|
+ {
|
|
|
+ old = findSyntax("//", sb.toString(), old);
|
|
|
+ if(old == -1)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ pos = findSyntax("\n", sb.toString(), old);
|
|
|
+ if(pos == -1)
|
|
|
+ {
|
|
|
+ sb.replace(old, sb.length(), "");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sb.replace(old, pos + 1, "");
|
|
|
+ }
|
|
|
+ // Ende Kommentare
|
|
|
+
|
|
|
+ // Schlüsselwörter ohne ()
|
|
|
+ keyWordBrackets("else", sb);
|
|
|
+ keyWordBrackets("try", sb);
|
|
|
+ keyWordBrackets("catch", sb);
|
|
|
+ // Ende Schlüsselwörter
|
|
|
+ code = sb.toString();
|
|
|
+ //System.out.println(code);
|
|
|
+
|
|
|
// Anfängliches Austauschen mit Functionssyntax
|
|
|
code = changeBiSyntax("^", "math.pow", code, false);
|
|
|
code = changeBiSyntax("/", "div", code, false);
|
|
@@ -486,8 +552,7 @@ public class Code implements Comparable<Code>
|
|
|
String actual;
|
|
|
int length = code.length();
|
|
|
int level = 1;
|
|
|
- int old;
|
|
|
- int pos = 0;
|
|
|
+ pos = 0;
|
|
|
int line = 0;
|
|
|
while(pos < length)
|
|
|
{
|
|
@@ -497,6 +562,7 @@ public class Code implements Comparable<Code>
|
|
|
//System.out.println("WUSI: " + actual);
|
|
|
if(actual.startsWith("@"))
|
|
|
{
|
|
|
+ // Setzt nur die richtige Ebene des Gotos, die genaue Position wird noch gesetzt
|
|
|
gotos.put(actual.substring(1), line);
|
|
|
pos++;
|
|
|
continue;
|
|
@@ -522,47 +588,59 @@ public class Code implements Comparable<Code>
|
|
|
|
|
|
// Anlegen eines Trees zum sortieren und einfügen von Code
|
|
|
TreeSet<Code> tree = new TreeSet(list);
|
|
|
- Code[] helper = tree.toArray(new Code[tree.size()]);
|
|
|
+ Code[] c = tree.toArray(new Code[tree.size()]);
|
|
|
|
|
|
// Einfügen von "gotoline" bei while-Schleifen
|
|
|
String function;
|
|
|
int baseLevel;
|
|
|
- for(int i = 0; i < helper.length; i++)
|
|
|
+ boolean lastLineChecker;
|
|
|
+ for(int i = 0; i < c.length; i++)
|
|
|
{
|
|
|
- function = helper[i].function;
|
|
|
+ function = c[i].function;
|
|
|
if(function == null || !function.equals("while"))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
- baseLevel = helper[i].level;
|
|
|
- for(int j = i + 1; j < helper.length; j++)
|
|
|
+ baseLevel = c[i].level;
|
|
|
+ lastLineChecker = true;
|
|
|
+ for(int j = i + 1; j < c.length; j++)
|
|
|
{
|
|
|
- if(helper[j].level <= baseLevel)
|
|
|
+ if(c[j].level <= baseLevel)
|
|
|
{
|
|
|
- helper[i].jump = j - i + 1;
|
|
|
- Code c = new Code("gotoline", helper[i].level, 0, helper[j].line, helper[j].subline + 1);
|
|
|
- while(tree.contains(c)) // Damit keine Whiles, die gleich enden, sich überschreiben
|
|
|
+ Code gotoLine = new Code("gotoline", c[i].level, 0, c[j].line, c[j].subline + 1);
|
|
|
+ while(tree.contains(gotoLine)) // Damit keine Whiles, die gleich enden, sich überschreiben
|
|
|
{
|
|
|
- c.subline++;
|
|
|
+ gotoLine.subline++;
|
|
|
}
|
|
|
- tree.add(c);
|
|
|
+ tree.add(gotoLine);
|
|
|
+ lastLineChecker = false;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ if(lastLineChecker)
|
|
|
+ {
|
|
|
+ sublines++;
|
|
|
+ Code gotoLine = new Code("gotoline", c[i].level, 0, c[c.length - 1].line + 1, sublines);
|
|
|
+ while(tree.contains(gotoLine)) // Damit keine Whiles, die gleich enden, sich überschreiben
|
|
|
+ {
|
|
|
+ gotoLine.subline++;
|
|
|
+ }
|
|
|
+ tree.add(gotoLine);
|
|
|
+ }
|
|
|
}
|
|
|
// Ende des While-Handlings
|
|
|
// Erstellen der Sprungmarken der Schlüsselwörter
|
|
|
- helper = tree.toArray(new Code[tree.size()]);
|
|
|
+ c = tree.toArray(new Code[tree.size()]);
|
|
|
|
|
|
boolean whileCheck = false;
|
|
|
int lastLineChange = 0;
|
|
|
line = 0;
|
|
|
- for(int i = 0; i < helper.length; i++)
|
|
|
+ for(int i = 0; i < c.length; i++)
|
|
|
{
|
|
|
- function = helper[i].function;
|
|
|
- if(helper[i].line != line)
|
|
|
+ function = c[i].function;
|
|
|
+ if(c[i].line != line)
|
|
|
{
|
|
|
- line = helper[i].line;
|
|
|
+ line = c[i].line;
|
|
|
lastLineChange = i;
|
|
|
}
|
|
|
if(function == null)
|
|
@@ -582,40 +660,41 @@ public class Code implements Comparable<Code>
|
|
|
default:
|
|
|
continue;
|
|
|
}
|
|
|
- baseLevel = helper[i].level;
|
|
|
- for(int j = i + 1; j < helper.length; j++)
|
|
|
+ baseLevel = c[i].level;
|
|
|
+ for(int j = i + 1; j < c.length; j++)
|
|
|
{
|
|
|
- if(helper[j].level <= baseLevel)
|
|
|
+ if(c[j].level <= baseLevel)
|
|
|
{
|
|
|
- helper[i].jump = j - i;
|
|
|
+ c[i].jump = j - i;
|
|
|
if(whileCheck)
|
|
|
{
|
|
|
+ // Setzt die Position von GotoLine bei While
|
|
|
whileCheck = false;
|
|
|
- helper[j].jump = lastLineChange - j;
|
|
|
+ c[j].jump = lastLineChange - j;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if(helper[i].jump == 0)
|
|
|
+ if(c[i].jump == 0)
|
|
|
{
|
|
|
- helper[i].jump = list.size() - i;
|
|
|
+ c[i].jump = tree.size() - i;
|
|
|
}
|
|
|
}
|
|
|
- // Ende der Srungmarken
|
|
|
- // Korrektur der Gotos;
|
|
|
- Code[] c = tree.toArray(new Code[list.size()]);
|
|
|
- gotos.entrySet().forEach((i) ->
|
|
|
+ // Ende der Sprungmarken
|
|
|
+ // Korrektur der Gotos
|
|
|
+ for(Entry<String, Integer> i : gotos.entrySet())
|
|
|
{
|
|
|
int value = i.getValue() + 1;
|
|
|
- for(int j = value; j < c.length; j++)
|
|
|
+ for(int j = value - 1; j < c.length; j++)
|
|
|
{
|
|
|
if(c[j].line == value)
|
|
|
{
|
|
|
+ //System.out.println("KORREKTUR VON " + i.getValue() + " AUF " + j);
|
|
|
i.setValue(j);
|
|
|
- return;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
// Ende
|
|
|
//java.util.Arrays.stream(c).forEach(co -> System.out.println(co.toString()));
|
|
|
//gotos.forEach((k, v) -> System.out.println(k + " " + v));
|