prepared interpreter fix

This commit is contained in:
weckyy702
2021-01-24 21:42:39 +01:00
parent 5e024f07f5
commit db3472f5ba
4 changed files with 375 additions and 328 deletions

2
.vscode/launch.json vendored
View File

@@ -8,7 +8,7 @@
"name": "Python: Aktuelle Datei", "name": "Python: Aktuelle Datei",
"type": "python", "type": "python",
"request": "launch", "request": "launch",
"program": "run.py", "program": "debug.py",
"console": "integratedTerminal" "console": "integratedTerminal"
} }
] ]

View File

@@ -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__()

View File

@@ -1,9 +1,10 @@
import logging import logging
import re 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 errors.custom import InterpreterException, JavaSyntaxError, ScopeNotFoundException
from draw.Iinstruction import * 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: logging.warning("""Because the Interpreter is still WIP, some Java language features are not supported. These include:
*foreach loops (will throw JavaSyntaxError) *foreach loops (will throw JavaSyntaxError)
@@ -12,28 +13,6 @@ logging.warning("""Because the Interpreter is still WIP, some Java language feat
*Generics *Generics
Please remove these features from the source code as they will result in incorrect behaviour""") 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: class JavaInterpreter:
def __init__(self, filepath: str) -> None: def __init__(self, filepath: str) -> None:
@@ -212,7 +191,6 @@ class JavaInterpreter:
instructions.append(for_instruction("while " + cond, child_instructions)) instructions.append(for_instruction("while " + cond, child_instructions))
return instructions, idx return instructions, idx
except IndexError: except IndexError:
raise JavaSyntaxError("Ill-formed for loop construct!") raise JavaSyntaxError("Ill-formed for loop construct!")
except: except:

View File

@@ -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 // public class Rover extends Actor
{ // {
private Display anzeige; // private Display anzeige;
/** // /**
* this function is to be implemented by the user // * this function is to be implemented by the user
* depending on the needed actions // * 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; if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30)
}
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 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");
} }
} }
/** if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270)
* Der Rover erzeugt ein Objekt der Klasse ᅵMarkierungᅵ auf seiner Position.
*/
public void setzeMarke()
{ {
getWorld().addObject(new Marke(), getX(), getY()); 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)
* *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) if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30)
{ {
return true; 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) nachricht("Befehl nicht korrekt!");
{
anzeige.anzeigen(pText);
Greenfoot.delay(1);
anzeige.loeschen();
}
} }
private void displayAusschalten() return false;
{ }
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;
};
}