cleaned up interpreter

This commit is contained in:
weckyy702
2020-12-29 00:20:13 +01:00
parent 311d0d5604
commit 5dc1f8e19d
2 changed files with 275 additions and 259 deletions

View File

@@ -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)
@@ -159,6 +166,10 @@ def handle_instruction(line: str, src: List[str], i: int) -> Tuple[Iinstruction,
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)
return generic_instruction(line), i
@@ -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)

View File

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