diff --git a/interpreter/interpret_source.py b/interpreter/interpret_source.py index 99f2a24..05573d6 100644 --- a/interpreter/interpret_source.py +++ b/interpreter/interpret_source.py @@ -2,7 +2,7 @@ import logging from os import remove import re from re import split -from typing import List, Tuple +from typing import List, Match, Tuple from errors.custom import InterpreterException, JavaSyntaxError, ScopeNotFoundException from draw.Iinstruction import * @@ -23,7 +23,7 @@ class Function_scope(Iterable): return self.contents.__iter__() COMMENT_PATTERN = re.compile(r"""^//|^/\*\*|^\*|^--""") -REMOVE_KEYWORDS = [' ', "public", "private", ';'] +REMOVE_KEYWORDS = [' ', "public", "private", "final"] VARIABLE_TAGS = ["byte", "short", "int", "long", "float", "double", "boolean", "char", "String"] FUNCTION_IDENTIFIERS = ["void"] FUNCTION_IDENTIFIERS.extend(VARIABLE_TAGS) @@ -36,7 +36,7 @@ remove_pattern = re.compile("|".join(REPLACE.keys())) variable_regex = "^(" for kw in FUNCTION_IDENTIFIERS: variable_regex += fr"""{kw}|""" -variable_pattern = re.compile(variable_regex[0:-1]+")$(.*)") +variable_pattern = re.compile(variable_regex[0:-1]+")(.*)") function_regex = "^(" for kw in FUNCTION_IDENTIFIERS: @@ -95,6 +95,7 @@ def get_scope_start_offset(src: List[str], i: int) -> int: return 2 raise ScopeNotFoundException("Unable to find scope start. Is the program ill-formed?") + def handle_while(line: str, src: List[str], i: int) -> Tuple[Iinstruction, int]: bracket_idx = line.rindex(')') # throws if while contruct is illformed @@ -146,6 +147,12 @@ def handle_do_while(line: str, src: List[str], i: int) -> Tuple[Iinstruction, in return while_instruction_back(instruction_txt, child_instructions), i +def handle_variable(line:str, src: List[str], i: int) -> Tuple[Iinstruction, int]: + groups = variable_pattern.match(line).groups() + var_type = groups[0] + var_name = groups[1] + return generic_instruction(f"{var_type} {var_name}"), i + def handle_instruction(line: str, src: List[str], i: int) -> Tuple[Iinstruction, int]: if line.startswith("while("): logging.debug("Found while construct in line: %i", i+1) @@ -158,6 +165,10 @@ def handle_instruction(line: str, src: List[str], i: int) -> Tuple[Iinstruction, elif line.startswith("do"): logging.debug("Found do-while construct in line: %i", i+1) return handle_do_while(line, src, i) + + # elif variable_pattern.match(line): + # logging.debug("Found variable in line %i", i+1) + # return handle_variable(line, src, i) else: logging.debug("found generic instruction in line %i", i+1) @@ -186,16 +197,21 @@ def get_instructions_in_scope(src: List[str], start_idx: int = 0) -> Tuple[List[ return outer_scope, i +def get_function_info(match: Match[str], line: str) -> Tuple[str, str, str]: + groups = match.groups() + ftype = groups[0] + fargs = groups[1] + fname = line.removeprefix(ftype).removesuffix(fargs) #remove return type and argument list to get the function name + return ftype, fname, fargs + def get_function_scopes(src: List[str]) -> List[Function_scope]: functions = [] + i = 0 while i < len(src): line = src[i] if match:=function_pattern.match(line): - groups = match.groups() - function_return_type = groups[0] - function_args = groups[1] - function_name = line.removeprefix(function_return_type).removesuffix(function_args) #remove return type and argument list to get the function name + function_return_type, function_name, function_args = get_function_info(match, line) brace_offset = get_scope_start_offset(src, i) child_instructions, i = get_instructions_in_scope(src, i+brace_offset) diff --git a/res/input/input.java b/res/input/input.java index 70f7ae2..108ef23 100644 --- a/res/input/input.java +++ b/res/input/input.java @@ -1,13 +1,13 @@ -//import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) +import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) -// 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 void act() { S66Nr3(7); @@ -39,288 +39,288 @@ drehe(pri); } -// private void fahreBisHuegel() -// { -// while(!huegelVorhanden("vorne")) -// { -// fahre(); -// } -// } + private void fahreBisHuegel() + { + while(!huegelVorhanden("vorne")) + { + fahre(); + } + } -// private void fahreZeileDreheHoch() -// { -// fahreBisHuegel(); -// fahreUmHuegel("Hoch"); -// fahreBisHuegel(); -// drehe("um"); + private void fahreZeileDreheHoch() + { + fahreBisHuegel(); + fahreUmHuegel("Hoch"); + fahreBisHuegel(); + drehe("um"); -// fahreBisHuegel(); -// fahreUmHuegel("Runter"); -// fahreBisHuegel(); -// drehe("rechts"); -// fahre(); -// drehe("rechts"); -// } + fahreBisHuegel(); + fahreUmHuegel("Runter"); + fahreBisHuegel(); + drehe("rechts"); + fahre(); + drehe("rechts"); + } -// private void fahreZeileDreheRunter(boolean geheInNächsteZeile) -// { -// fahreBisHuegel(); -// fahreUmHuegel("Runter"); -// fahreBisHuegel(); -// drehe("um"); + 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"); -// } -// } + 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; -// } -// fahreZeileDreheHoch(); -// //for(int i = 1; i < anzahlZeilen-1; i++) { -// fahreZeileDreheRunter(true); -// //} -// fahreZeileDreheRunter(false); -// } + private void S66Nr3(int anzahlZeilen) + { + if(anzahlZeilen < 3) { + nachricht("Ich muss mindestens drei Zeilen fahren! :("); + return; + } + fahreZeileDreheHoch(); + for(int i = 1; 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(); + /** + * 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(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"); -// // } -// // } + 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 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; + /** + * 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; -// // } + 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(); + /** + * 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==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==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==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" && 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!"); -// // } + if(richtung!="vorne" && richtung!="links" && richtung!="rechts") + { + nachricht("Befehl nicht korrekt!"); + } -// // return false; -// // } + 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 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 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; -// // } + /** + * *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; -// // } + return false; + } -// // public void entferneMarke() -// // { -// // if(markeVorhanden()) -// // { -// // removeTouching(Marke.class); -// // } -// // } + 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 nachricht(String pText) + { + if(anzeige!=null) + { + anzeige.anzeigen(pText); + Greenfoot.delay(1); + anzeige.loeschen(); + } + } -// // private void displayAusschalten() -// // { -// // getWorld().removeObject(anzeige); + private void displayAusschalten() + { + getWorld().removeObject(anzeige); -// // } + } -// // protected void addedToWorld(World world) -// // { + 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"); + 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; + class Display extends Actor + { + GreenfootImage bild; -// // public Display() -// // { -// // bild = getImage(); -// // } + public Display() + { + bild = getImage(); + } -// // public void act() -// // { + 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 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 void loeschen() + { + getImage().clear(); + setImage("images/nachricht.png"); + } -// // } + } -// // public class Direction { -// // Direction(int val){ -// // this.value = val; -// // } -// // final int value; -// // }; -// // } + public class Direction { + Direction(int val){ + this.value = val; + } + final int value; + }; +}