1
0
Prechádzať zdrojové kódy

Schlüsselwörter else, try, catch ohne () möglich, Kommentare

Kajetan Johannes Hammerle 7 rokov pred
rodič
commit
d009387ec2

BIN
.DS_Store


+ 2 - 0
nbproject/private/private.xml

@@ -3,8 +3,10 @@
     <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
     <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
         <group>
+            <file>file:/Users/kajetanjohannes/Dropbox/Projekte/Informatik/SnuviScript/src/me/hammerle/code/ScriptControl.java</file>
             <file>file:/Users/kajetanjohannes/Dropbox/Projekte/Informatik/SnuviScript/src/me/hammerle/code/CodeParser.java</file>
             <file>file:/Users/kajetanjohannes/Dropbox/Projekte/Informatik/SnuviScript/src/me/hammerle/code/Code.java</file>
+            <file>file:/Users/kajetanjohannes/Dropbox/Projekte/Informatik/SnuviScript/src/me/hammerle/code/Script.java</file>
         </group>
     </open-files>
 </project-private>

+ 112 - 33
src/me/hammerle/code/Code.java

@@ -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));

+ 1 - 1
src/me/hammerle/code/Script.java

@@ -146,11 +146,11 @@ public class Script
             }
             catch(Exception ex)
             {
-                position++;
                 if(ex.getClass() != HoldCodeException.class)
                 {
                     CodeParser.printQuestException(this, ex, code[position].toString());
                 }
+                position++;
             }
         }
     }

+ 1 - 1
src/me/hammerle/code/ScriptControl.java

@@ -50,7 +50,7 @@ public class ScriptControl
   
     public static void startScriptFromFile(String scriptName)
     { 
-        Script sd = new Script(idCounter, scriptName, String.join("", ScriptUtils.readCode(scriptName)));
+        Script sd = new Script(idCounter, scriptName, String.join("\n", ScriptUtils.readCode(scriptName)));
         SCRIPTS.put(idCounter, sd);
         idCounter++;
         sd.runCode();

+ 1 - 3
start.snuvi

@@ -9,6 +9,4 @@ while(x < 256)
     reset();
 }
 g.repaint();
-wait();
-
-
+wait();