diff --git a/interpreter/function_scope.py b/interpreter/function_scope.py new file mode 100644 index 0000000..bb40936 --- /dev/null +++ b/interpreter/function_scope.py @@ -0,0 +1,25 @@ +from typing import Iterable, List +from draw.Iinstruction import Iinstruction + + +class Function_scope(Iterable): + def __init__(self, child_instructions: List[Iinstruction], name: str, return_type: str, args: List[str]) -> None: + self.contents = child_instructions + self.name = name + self.return_type = return_type + self.args = args + + def get_height(self) -> int: + h = 0.0 + for inst in self.contents: + h += inst.getblkheight() + return int(h) + + def get_width(self) -> int: + w = 200.0 + for inst in self.contents: + w = max(w, inst.getblkwidth()) + return int(w) + + def __iter__(self): + return self.contents.__iter__() \ No newline at end of file diff --git a/interpreter/interpret_source.py b/interpreter/interpret_source.py index e0516f8..235fba3 100644 --- a/interpreter/interpret_source.py +++ b/interpreter/interpret_source.py @@ -1,9 +1,10 @@ import logging import re -from typing import Dict, List, Match, Tuple, Union +from typing import Dict, List, Match, Tuple, Union, Iterable from errors.custom import InterpreterException, JavaSyntaxError, ScopeNotFoundException from draw.Iinstruction import * +from interpreter.function_scope import * logging.warning("""Because the Interpreter is still WIP, some Java language features are not supported. These include: *foreach loops (will throw JavaSyntaxError) @@ -12,28 +13,6 @@ logging.warning("""Because the Interpreter is still WIP, some Java language feat *Generics Please remove these features from the source code as they will result in incorrect behaviour""") -class Function_scope(Iterable): - def __init__(self, child_instructions: List[Iinstruction], name: str, return_type: str, args: List[str]) -> None: - self.contents = child_instructions - self.name = name - self.return_type = return_type - self.args = args - - def get_height(self) -> int: - h = 0.0 - for inst in self.contents: - h += inst.getblkheight() - return int(h) - - def get_width(self) -> int: - w = 200.0 - for inst in self.contents: - w = max(w, inst.getblkwidth()) - return int(w) - - def __iter__(self): - return self.contents.__iter__() - class JavaInterpreter: def __init__(self, filepath: str) -> None: @@ -212,7 +191,6 @@ class JavaInterpreter: instructions.append(for_instruction("while " + cond, child_instructions)) return instructions, idx - except IndexError: raise JavaSyntaxError("Ill-formed for loop construct!") except: diff --git a/res/input/input.java b/res/input/input.java index 6004bbe..1030306 100644 --- a/res/input/input.java +++ b/res/input/input.java @@ -1,331 +1,375 @@ -import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +// import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -//Comment that the interpreter may never know of +// //Comment that the interpreter may never know of -public class Rover extends Actor -{ - private Display anzeige; +// public class Rover extends Actor +// { +// private Display anzeige; - /** - * this function is to be implemented by the user - * depending on the needed actions - */ +// /** +// * this function is to be implemented by the user +// * depending on the needed actions +// */ - public Display getDisplay() +// public Display getDisplay() +// { +// return anzeige; +// } + +// public void act() +// { +// S66Nr3(7); +// } + +// private void fahreUmHuegel(String richtung) +// { +// String pri; +// String sec; +// if(richtung.equals("Hoch")) { +// pri = "links"; +// sec = "rechts"; +// } else if (richtung.equals("Runter")) { +// pri = "rechts"; +// sec = "links"; +// } else { +// nachricht("JUNGE DU SPAST!"); +// return; +// } +// drehe(pri); +// fahre(); +// drehe(sec); +// fahre(); +// fahre(); +// drehe(sec); +// fahre(); +// drehe(pri); +// } + +// private void fahreBisHuegel() +// { +// while(!huegelVorhanden("vorne")) +// { +// fahre(); +// } +// } + +// private void fahreZeileDreheHoch() +// { +// fahreBisHuegel(); +// fahreUmHuegel("Hoch"); +// fahreBisHuegel(); +// drehe("um"); + +// fahreBisHuegel(); +// fahreUmHuegel("Runter"); +// fahreBisHuegel(); +// drehe("rechts"); +// fahre(); +// drehe("rechts"); +// } + +// private void fahreZeileDreheRunter(boolean geheInNächsteZeile) +// { +// fahreBisHuegel(); +// fahreUmHuegel("Runter"); +// fahreBisHuegel(); +// drehe("um"); + +// fahreBisHuegel(); +// fahreUmHuegel("Hoch"); +// fahreBisHuegel(); +// if(geheInNächsteZeile) { +// drehe("rechts"); +// fahre(); +// drehe("rechts"); +// } else { +// drehe("um"); +// } +// } + +// private void S66Nr3(int anzahlZeilen) +// { +// if(anzahlZeilen < 3) { +// nachricht("Ich muss mindestens drei Zeilen fahren! :("); +// return; +// } +// int i = 1; +// fahreZeileDreheHoch(); +// for(; i < anzahlZeilen-1; i++) { +// fahreZeileDreheRunter(true); +// } +// fahreZeileDreheRunter(false); +// } + +// /** +// * Der Rover bewegt sich ein Feld in Fahrtrichtung weiter. +// * Sollte sich in Fahrtrichtung ein Objekt der Klasse Huegel befinden oder er sich an der Grenze der Welt befinden, +// * dann erscheint eine entsprechende Meldung auf dem Display. +// */ +// public void fahre() +// { +// int posX = getX(); +// int posY = getY(); + +// if(huegelVorhanden("vorne")) +// { +// nachricht("Zu steil!"); +// } +// else if(getRotation()==270 && getY()==1) +// { +// nachricht("Ich kann mich nicht bewegen"); +// } +// else +// { +// move(1); +// Greenfoot.delay(1); +// } + +// if(posX==getX()&&posY==getY()&&!huegelVorhanden("vorne")) +// { +// nachricht("Ich kann mich nicht bewegen"); +// } +// } + +// /** +// * Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung (ᅵlinksᅵ oder ᅵrechtsᅵ) ᅵbergeben wurde. +// * Sollte ein anderer Text (String) als "rechts" oder "links" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display. +// */ +// public void drehe(String richtung) +// { +// if(richtung.equals("rechts")){ +// setRotation(getRotation()+90); +// }else if(richtung.equals("links")){ +// setRotation(getRotation()-90); +// } else if(richtung.equals("um")) { +// setRotation(getRotation()+180); +// }else { +// nachricht("Keinen Korrekte Richtung gegeben!"); +// } +// } + +// /** +// * Der Rover gibt durch einen Wahrheitswert (true oder false )zurᅵck, ob sich auf seiner Position ein Objekt der Klasse Gestein befindet. +// * Eine entsprechende Meldung erscheint auch auf dem Display. +// */ +// public boolean gesteinVorhanden() +// { +// if(getOneIntersectingObject(Gestein.class)!=null) +// { +// nachricht("Gestein gefunden!"); +// return true; + +// } + +// return false; +// } + +// /** +// * Der Rover ᅵberprᅵft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet. +// * Das Ergebnis wird auf dem Display angezeigt. +// * Sollte ein anderer Text (String) als "rechts", "links" oder "vorne" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display. +// */ +// public boolean huegelVorhanden(String richtung) +// { +// int rot = getRotation(); + +// if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90) +// { +// if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30) +// { +// return true; +// } +// } + +// if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270) +// { +// if(getOneObjectAtOffset(-1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(-1,0,Huegel.class)).getSteigung() >30) +// { +// return true; +// } +// } + +// if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180) +// { +// if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30) +// { +// return true; +// } + +// } + +// if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0) +// { +// if(getOneObjectAtOffset(0,-1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,-1,Huegel.class)).getSteigung() >30) +// { +// return true; +// } + +// } + +// if(richtung!="vorne" && richtung!="links" && richtung!="rechts") +// { +// nachricht("Befehl nicht korrekt!"); +// } + +// return false; +// } + +// /** +// * Der Rover ermittelt den Wassergehalt des Gesteins auf seiner Position und gibt diesen auf dem Display aus. +// * Sollte kein Objekt der Klasse Gestein vorhanden sein, dann erscheint eine entsprechende Meldung auf dem Display. +// */ +// public void analysiereGestein() +// { +// if(gesteinVorhanden()) +// { +// nachricht("Gestein untersucht! Wassergehalt ist " + ((Gestein)getOneIntersectingObject(Gestein.class)).getWassergehalt()+"%."); +// Greenfoot.delay(1); +// removeTouching(Gestein.class); +// } +// else +// { +// nachricht("Hier ist kein Gestein"); +// } +// } + +// /** +// * Der Rover erzeugt ein Objekt der Klasse ᅵMarkierungᅵ auf seiner Position. +// */ +// public void setzeMarke() +// { +// getWorld().addObject(new Marke(), getX(), getY()); +// } + +// /** +// * *Der Rover gibt durch einen Wahrheitswert (true oder false )zurᅵck, ob sich auf seiner Position ein Objekt der Marke befindet. +// * Eine entsprechende Meldung erscheint auch auf dem Display. +// */ +// public boolean markeVorhanden() +// { +// if(getOneIntersectingObject(Marke.class)!=null) +// { +// return true; +// } + +// return false; +// } + +// public void entferneMarke() +// { +// if(markeVorhanden()) +// { +// removeTouching(Marke.class); +// } +// } + +// private void nachricht(String pText) +// { +// if(anzeige!=null) +// { +// anzeige.anzeigen(pText); +// Greenfoot.delay(1); +// anzeige.loeschen(); +// } +// } + +// private void displayAusschalten() +// { +// getWorld().removeObject(anzeige); + +// } + +// protected void addedToWorld(World world) +// { +// setImage("images/rover.png"); +// world = getWorld(); +// anzeige = new Display(); +// anzeige.setImage("images/nachricht.png"); +// world.addObject(anzeige, 7, 0); +// if(getY()==0) +// { +// setLocation(getX(),1); +// } +// anzeige.anzeigen("Ich bin bereit"); +// } + +// class Display extends Actor +// { +// GreenfootImage bild; + +// public Display() +// { +// bild = getImage(); +// } + +// public void act() +// { + +// } + +// public void anzeigen(String pText) +// { +// loeschen(); +// getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)),10,10); + +// } + +// public void loeschen() +// { +// getImage().clear(); +// setImage("images/nachricht.png"); +// } + +// } + +// public class Direction { +// Direction(int val){ +// this.value = val; +// } +// final int value; +// }; +// } +public void test_function() { + int rot = getRotation(); + + if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90) { - return anzeige; - } - - public void act() - { - S66Nr3(7); - } - - private void fahreUmHuegel(String richtung) - { - String pri; - String sec; - if(richtung.equals("Hoch")) { - pri = "links"; - sec = "rechts"; - } else if (richtung.equals("Runter")) { - pri = "rechts"; - sec = "links"; - } else { - nachricht("JUNGE DU SPAST!"); - return; - } - drehe(pri); - fahre(); - drehe(sec); - fahre(); - fahre(); - drehe(sec); - fahre(); - drehe(pri); - } - - private void fahreBisHuegel() - { - while(!huegelVorhanden("vorne")) + if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30) { - fahre(); - } - } - - private void fahreZeileDreheHoch() - { - fahreBisHuegel(); - fahreUmHuegel("Hoch"); - fahreBisHuegel(); - drehe("um"); - - fahreBisHuegel(); - fahreUmHuegel("Runter"); - fahreBisHuegel(); - drehe("rechts"); - fahre(); - drehe("rechts"); - } - - private void fahreZeileDreheRunter(boolean geheInNächsteZeile) - { - fahreBisHuegel(); - fahreUmHuegel("Runter"); - fahreBisHuegel(); - drehe("um"); - - fahreBisHuegel(); - fahreUmHuegel("Hoch"); - fahreBisHuegel(); - if(geheInNächsteZeile) { - drehe("rechts"); - fahre(); - drehe("rechts"); - } else { - drehe("um"); - } - } - - private void S66Nr3(int anzahlZeilen) - { - if(anzahlZeilen < 3) { - nachricht("Ich muss mindestens drei Zeilen fahren! :("); - return; - } - int i = 1; - fahreZeileDreheHoch(); - for(; i < anzahlZeilen-1; i++) { - fahreZeileDreheRunter(true); - } - fahreZeileDreheRunter(false); - } - - /** - * Der Rover bewegt sich ein Feld in Fahrtrichtung weiter. - * Sollte sich in Fahrtrichtung ein Objekt der Klasse Huegel befinden oder er sich an der Grenze der Welt befinden, - * dann erscheint eine entsprechende Meldung auf dem Display. - */ - public void fahre() - { - int posX = getX(); - int posY = getY(); - - if(huegelVorhanden("vorne")) - { - nachricht("Zu steil!"); - } - else if(getRotation()==270 && getY()==1) - { - nachricht("Ich kann mich nicht bewegen"); - } - else - { - move(1); - Greenfoot.delay(1); - } - - if(posX==getX()&&posY==getY()&&!huegelVorhanden("vorne")) - { - nachricht("Ich kann mich nicht bewegen"); - } - } - - /** - * Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung (ᅵlinksᅵ oder ᅵrechtsᅵ) ᅵbergeben wurde. - * Sollte ein anderer Text (String) als "rechts" oder "links" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display. - */ - public void drehe(String richtung) - { - if(richtung.equals("rechts")){ - setRotation(getRotation()+90); - }else if(richtung.equals("links")){ - setRotation(getRotation()-90); - } else if(richtung.equals("um")) { - setRotation(getRotation()+180); - }else { - nachricht("Keinen Korrekte Richtung gegeben!"); - } - } - - /** - * Der Rover gibt durch einen Wahrheitswert (true oder false )zurᅵck, ob sich auf seiner Position ein Objekt der Klasse Gestein befindet. - * Eine entsprechende Meldung erscheint auch auf dem Display. - */ - public boolean gesteinVorhanden() - { - if(getOneIntersectingObject(Gestein.class)!=null) - { - nachricht("Gestein gefunden!"); return true; - - } - - return false; - } - - /** - * Der Rover ᅵberprᅵft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet. - * Das Ergebnis wird auf dem Display angezeigt. - * Sollte ein anderer Text (String) als "rechts", "links" oder "vorne" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display. - */ - public boolean huegelVorhanden(String richtung) - { - int rot = getRotation(); - - if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90) - { - if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30) - { - return true; - } - } - - if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270) - { - if(getOneObjectAtOffset(-1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(-1,0,Huegel.class)).getSteigung() >30) - { - return true; - } - } - - if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180) - { - if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30) - { - return true; - } - - } - - if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0) - { - if(getOneObjectAtOffset(0,-1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,-1,Huegel.class)).getSteigung() >30) - { - return true; - } - - } - - if(richtung!="vorne" && richtung!="links" && richtung!="rechts") - { - nachricht("Befehl nicht korrekt!"); - } - - return false; - } - - /** - * Der Rover ermittelt den Wassergehalt des Gesteins auf seiner Position und gibt diesen auf dem Display aus. - * Sollte kein Objekt der Klasse Gestein vorhanden sein, dann erscheint eine entsprechende Meldung auf dem Display. - */ - public void analysiereGestein() - { - if(gesteinVorhanden()) - { - nachricht("Gestein untersucht! Wassergehalt ist " + ((Gestein)getOneIntersectingObject(Gestein.class)).getWassergehalt()+"%."); - Greenfoot.delay(1); - removeTouching(Gestein.class); - } - else - { - nachricht("Hier ist kein Gestein"); } } - /** - * Der Rover erzeugt ein Objekt der Klasse ᅵMarkierungᅵ auf seiner Position. - */ - public void setzeMarke() + if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270) { - getWorld().addObject(new Marke(), getX(), getY()); + if(getOneObjectAtOffset(-1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(-1,0,Huegel.class)).getSteigung() >30) + { + return true; + } } - /** - * *Der Rover gibt durch einen Wahrheitswert (true oder false )zurᅵck, ob sich auf seiner Position ein Objekt der Marke befindet. - * Eine entsprechende Meldung erscheint auch auf dem Display. - */ - public boolean markeVorhanden() + if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180) { - if(getOneIntersectingObject(Marke.class)!=null) + if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30) { return true; } - return false; } - public void entferneMarke() + if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0) { - if(markeVorhanden()) + if(getOneObjectAtOffset(0,-1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,-1,Huegel.class)).getSteigung() >30) { - removeTouching(Marke.class); + return true; } + } - private void nachricht(String pText) + if(richtung!="vorne" && richtung!="links" && richtung!="rechts") { - if(anzeige!=null) - { - anzeige.anzeigen(pText); - Greenfoot.delay(1); - anzeige.loeschen(); - } + nachricht("Befehl nicht korrekt!"); } - private void displayAusschalten() - { - getWorld().removeObject(anzeige); - - } - - protected void addedToWorld(World world) - { - setImage("images/rover.png"); - world = getWorld(); - anzeige = new Display(); - anzeige.setImage("images/nachricht.png"); - world.addObject(anzeige, 7, 0); - if(getY()==0) - { - setLocation(getX(),1); - } - anzeige.anzeigen("Ich bin bereit"); - } - - class Display extends Actor - { - GreenfootImage bild; - - public Display() - { - bild = getImage(); - } - - public void act() - { - - } - - public void anzeigen(String pText) - { - loeschen(); - getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)),10,10); - - } - - public void loeschen() - { - getImage().clear(); - setImage("images/nachricht.png"); - } - - } - - public class Direction { - Direction(int val){ - this.value = val; - } - final int value; - }; -} + return false; +} \ No newline at end of file