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 from os import remove
import re import re
from re import split from re import split
from typing import List, Tuple from typing import List, Match, Tuple
from errors.custom import InterpreterException, JavaSyntaxError, ScopeNotFoundException from errors.custom import InterpreterException, JavaSyntaxError, ScopeNotFoundException
from draw.Iinstruction import * from draw.Iinstruction import *
@@ -23,7 +23,7 @@ class Function_scope(Iterable):
return self.contents.__iter__() return self.contents.__iter__()
COMMENT_PATTERN = re.compile(r"""^//|^/\*\*|^\*|^--""") 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"] VARIABLE_TAGS = ["byte", "short", "int", "long", "float", "double", "boolean", "char", "String"]
FUNCTION_IDENTIFIERS = ["void"] FUNCTION_IDENTIFIERS = ["void"]
FUNCTION_IDENTIFIERS.extend(VARIABLE_TAGS) FUNCTION_IDENTIFIERS.extend(VARIABLE_TAGS)
@@ -36,7 +36,7 @@ remove_pattern = re.compile("|".join(REPLACE.keys()))
variable_regex = "^(" variable_regex = "^("
for kw in FUNCTION_IDENTIFIERS: for kw in FUNCTION_IDENTIFIERS:
variable_regex += fr"""{kw}|""" variable_regex += fr"""{kw}|"""
variable_pattern = re.compile(variable_regex[0:-1]+")$(.*)") variable_pattern = re.compile(variable_regex[0:-1]+")(.*)")
function_regex = "^(" function_regex = "^("
for kw in FUNCTION_IDENTIFIERS: for kw in FUNCTION_IDENTIFIERS:
@@ -95,6 +95,7 @@ def get_scope_start_offset(src: List[str], i: int) -> int:
return 2 return 2
raise ScopeNotFoundException("Unable to find scope start. Is the program ill-formed?") 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]: def handle_while(line: str, src: List[str], i: int) -> Tuple[Iinstruction, int]:
bracket_idx = line.rindex(')') # throws if while contruct is illformed 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 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]: def handle_instruction(line: str, src: List[str], i: int) -> Tuple[Iinstruction, int]:
if line.startswith("while("): if line.startswith("while("):
logging.debug("Found while construct in line: %i", i+1) 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"): elif line.startswith("do"):
logging.debug("Found do-while construct in line: %i", i+1) logging.debug("Found do-while construct in line: %i", i+1)
return handle_do_while(line, src, i) 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: else:
logging.debug("found generic instruction in line %i", i+1) 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 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]: def get_function_scopes(src: List[str]) -> List[Function_scope]:
functions = [] functions = []
i = 0 i = 0
while i < len(src): while i < len(src):
line = src[i] line = src[i]
if match:=function_pattern.match(line): if match:=function_pattern.match(line):
groups = match.groups() function_return_type, function_name, function_args = get_function_info(match, line)
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
brace_offset = get_scope_start_offset(src, i) brace_offset = get_scope_start_offset(src, i)
child_instructions, i = get_instructions_in_scope(src, i+brace_offset) 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 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 void act() public void act()
{ {
S66Nr3(7); S66Nr3(7);
@@ -39,288 +39,288 @@
drehe(pri); drehe(pri);
} }
// private void fahreBisHuegel() private void fahreBisHuegel()
// { {
// while(!huegelVorhanden("vorne")) while(!huegelVorhanden("vorne"))
// { {
// fahre(); fahre();
// } }
// } }
// private void fahreZeileDreheHoch() private void fahreZeileDreheHoch()
// { {
// fahreBisHuegel(); fahreBisHuegel();
// fahreUmHuegel("Hoch"); fahreUmHuegel("Hoch");
// fahreBisHuegel(); fahreBisHuegel();
// drehe("um"); drehe("um");
// fahreBisHuegel(); fahreBisHuegel();
// fahreUmHuegel("Runter"); fahreUmHuegel("Runter");
// fahreBisHuegel(); fahreBisHuegel();
// drehe("rechts"); drehe("rechts");
// fahre(); fahre();
// drehe("rechts"); drehe("rechts");
// } }
// private void fahreZeileDreheRunter(boolean geheInNächsteZeile) private void fahreZeileDreheRunter(boolean geheInNächsteZeile)
// { {
// fahreBisHuegel(); fahreBisHuegel();
// fahreUmHuegel("Runter"); fahreUmHuegel("Runter");
// fahreBisHuegel(); fahreBisHuegel();
// drehe("um"); drehe("um");
// fahreBisHuegel(); fahreBisHuegel();
// fahreUmHuegel("Hoch"); fahreUmHuegel("Hoch");
// fahreBisHuegel(); fahreBisHuegel();
// if(geheInNächsteZeile) { if(geheInNächsteZeile) {
// drehe("rechts"); drehe("rechts");
// fahre(); fahre();
// drehe("rechts"); drehe("rechts");
// } else { } else {
// drehe("um"); drehe("um");
// } }
// } }
// private void S66Nr3(int anzahlZeilen) private void S66Nr3(int anzahlZeilen)
// { {
// if(anzahlZeilen < 3) { if(anzahlZeilen < 3) {
// nachricht("Ich muss mindestens drei Zeilen fahren! :("); nachricht("Ich muss mindestens drei Zeilen fahren! :(");
// return; return;
// } }
// fahreZeileDreheHoch(); fahreZeileDreheHoch();
// //for(int i = 1; i < anzahlZeilen-1; i++) { for(int i = 1; i < anzahlZeilen-1; i++) {
// fahreZeileDreheRunter(true); fahreZeileDreheRunter(true);
// //} }
// fahreZeileDreheRunter(false); fahreZeileDreheRunter(false);
// } }
// // /** /**
// // * Der Rover bewegt sich ein Feld in Fahrtrichtung weiter. * 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, * 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. * dann erscheint eine entsprechende Meldung auf dem Display.
// // */ */
// // public void fahre() public void fahre()
// // { {
// // int posX = getX(); int posX = getX();
// // int posY = getY(); int posY = getY();
// // if(huegelVorhanden("vorne")) if(huegelVorhanden("vorne"))
// // { {
// // nachricht("Zu steil!"); nachricht("Zu steil!");
// // } }
// // else if(getRotation()==270 && getY()==1) else if(getRotation()==270 && getY()==1)
// // { {
// // nachricht("Ich kann mich nicht bewegen"); nachricht("Ich kann mich nicht bewegen");
// // } }
// // else else
// // { {
// // move(1); move(1);
// // Greenfoot.delay(1); Greenfoot.delay(1);
// // } }
// // if(posX==getX()&&posY==getY()&&!huegelVorhanden("vorne")) if(posX==getX()&&posY==getY()&&!huegelVorhanden("vorne"))
// // { {
// // nachricht("Ich kann mich nicht bewegen"); nachricht("Ich kann mich nicht bewegen");
// // } }
// // } }
// // /** /**
// // * Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung (ᅵlinksᅵ oder ᅵrechtsᅵ) ᅵbergeben wurde. * 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. * Sollte ein anderer Text (String) als "rechts" oder "links" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
// // */ */
// // public void drehe(String richtung) public void drehe(String richtung)
// // { {
// // if(richtung.equals("rechts")){ if(richtung.equals("rechts")){
// // setRotation(getRotation()+90); setRotation(getRotation()+90);
// // }else if(richtung.equals("links")){ }else if(richtung.equals("links")){
// // setRotation(getRotation()-90); setRotation(getRotation()-90);
// // } else if(richtung.equals("um")) { } else if(richtung.equals("um")) {
// // setRotation(getRotation()+180); setRotation(getRotation()+180);
// // }else { }else {
// // nachricht("Keinen Korrekte Richtung gegeben!"); 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. * 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. * Eine entsprechende Meldung erscheint auch auf dem Display.
// // */ */
// // public boolean gesteinVorhanden() public boolean gesteinVorhanden()
// // { {
// // if(getOneIntersectingObject(Gestein.class)!=null) if(getOneIntersectingObject(Gestein.class)!=null)
// // { {
// // nachricht("Gestein gefunden!"); nachricht("Gestein gefunden!");
// // return true; return true;
// // } }
// // return false; return false;
// // } }
// // /** /**
// // * Der Rover ᅵberprᅵft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet. * 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. * 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. * 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) public boolean huegelVorhanden(String richtung)
// // { {
// // int rot = getRotation(); int rot = getRotation();
// // if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90) 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) if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30)
// // { {
// // return true; return true;
// // } }
// // } }
// // if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270) 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) if(getOneObjectAtOffset(-1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(-1,0,Huegel.class)).getSteigung() >30)
// // { {
// // return true; return true;
// // } }
// // } }
// // if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180) 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) if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30)
// // { {
// // return true; return true;
// // } }
// // } }
// // if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0) 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) if(getOneObjectAtOffset(0,-1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,-1,Huegel.class)).getSteigung() >30)
// // { {
// // return true; return true;
// // } }
// // } }
// // if(richtung!="vorne" && richtung!="links" && richtung!="rechts") if(richtung!="vorne" && richtung!="links" && richtung!="rechts")
// // { {
// // nachricht("Befehl nicht korrekt!"); 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. * 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. * Sollte kein Objekt der Klasse Gestein vorhanden sein, dann erscheint eine entsprechende Meldung auf dem Display.
// // */ */
// // public void analysiereGestein() public void analysiereGestein()
// // { {
// // if(gesteinVorhanden()) if(gesteinVorhanden())
// // { {
// // nachricht("Gestein untersucht! Wassergehalt ist " + ((Gestein)getOneIntersectingObject(Gestein.class)).getWassergehalt()+"%."); nachricht("Gestein untersucht! Wassergehalt ist " + ((Gestein)getOneIntersectingObject(Gestein.class)).getWassergehalt()+"%.");
// // Greenfoot.delay(1); Greenfoot.delay(1);
// // removeTouching(Gestein.class); removeTouching(Gestein.class);
// // } }
// // else else
// // { {
// // nachricht("Hier ist kein Gestein"); nachricht("Hier ist kein Gestein");
// // } }
// // } }
// // /** /**
// // * Der Rover erzeugt ein Objekt der Klasse ᅵMarkierungᅵ auf seiner Position. * Der Rover erzeugt ein Objekt der Klasse ᅵMarkierungᅵ auf seiner Position.
// // */ */
// // public void setzeMarke() public void setzeMarke()
// // { {
// // getWorld().addObject(new Marke(), getX(), getY()); 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. * *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. * Eine entsprechende Meldung erscheint auch auf dem Display.
// // */ */
// // public boolean markeVorhanden() public boolean markeVorhanden()
// // { {
// // if(getOneIntersectingObject(Marke.class)!=null) if(getOneIntersectingObject(Marke.class)!=null)
// // { {
// // return true; return true;
// // } }
// // return false; return false;
// // } }
// // public void entferneMarke() public void entferneMarke()
// // { {
// // if(markeVorhanden()) if(markeVorhanden())
// // { {
// // removeTouching(Marke.class); removeTouching(Marke.class);
// // } }
// // } }
// // private void nachricht(String pText) private void nachricht(String pText)
// // { {
// // if(anzeige!=null) if(anzeige!=null)
// // { {
// // anzeige.anzeigen(pText); anzeige.anzeigen(pText);
// // Greenfoot.delay(1); Greenfoot.delay(1);
// // anzeige.loeschen(); anzeige.loeschen();
// // } }
// // } }
// // private void displayAusschalten() private void displayAusschalten()
// // { {
// // getWorld().removeObject(anzeige); getWorld().removeObject(anzeige);
// // } }
// // protected void addedToWorld(World world) protected void addedToWorld(World world)
// // { {
// // setImage("images/rover.png"); setImage("images/rover.png");
// // world = getWorld(); world = getWorld();
// // anzeige = new Display(); anzeige = new Display();
// // anzeige.setImage("images/nachricht.png"); anzeige.setImage("images/nachricht.png");
// // world.addObject(anzeige, 7, 0); world.addObject(anzeige, 7, 0);
// // if(getY()==0) if(getY()==0)
// // { {
// // setLocation(getX(),1); setLocation(getX(),1);
// // } }
// // anzeige.anzeigen("Ich bin bereit"); anzeige.anzeigen("Ich bin bereit");
// // } }
// // class Display extends Actor class Display extends Actor
// // { {
// // GreenfootImage bild; GreenfootImage bild;
// // public Display() public Display()
// // { {
// // bild = getImage(); bild = getImage();
// // } }
// // public void act() public void act()
// // { {
// // } }
// // public void anzeigen(String pText) public void anzeigen(String pText)
// // { {
// // loeschen(); loeschen();
// // getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)),10,10); getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)),10,10);
// // } }
// // public void loeschen() public void loeschen()
// // { {
// // getImage().clear(); getImage().clear();
// // setImage("images/nachricht.png"); setImage("images/nachricht.png");
// // } }
// // } }
// // public class Direction { public class Direction {
// // Direction(int val){ Direction(int val){
// // this.value = val; this.value = val;
// // } }
// // final int value; final int value;
// // }; };
// // } }