diff --git a/src/main/java/de/tudresden/inf/st/mg/Main.java b/src/main/java/de/tudresden/inf/st/mg/Main.java index 60829c7299a3b4b1d1083fc996484de2ffc35427..de555c72af11836d788b5276ff4d18759792af6f 100644 --- a/src/main/java/de/tudresden/inf/st/mg/Main.java +++ b/src/main/java/de/tudresden/inf/st/mg/Main.java @@ -13,6 +13,8 @@ import de.tudresden.inf.st.mg.jastadd.model.JastAddList; import de.tudresden.inf.st.mg.jastadd.model.RobotWorld; import de.tudresden.inf.st.mg.jastadd.model.Table; import de.tudresden.inf.st.mg.jastadd.model.World; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -21,9 +23,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Comparator; import java.util.Random; +import java.util.concurrent.TimeUnit; public class Main { + private static final Logger logger = LoggerFactory.getLogger(Main.class); + public static final Path TIDY_AST_DIAGRAM_DIR = Path.of("src", "gen", "resources", "diagrams", "parsing", "tidy"); private final RobotWorld world; @@ -85,28 +90,44 @@ public class Main { } - private Thread parse; + private ParseThread parse; - public void startParse() { - if (parse != null && parse.isAlive()) { - parse.interrupt(); // if not working replace by stop() + class ParseThread extends Thread { + + private RobotParser parser; + + @Override + public void run() { + logger.info("starting to parse"); + // create a parser using the world + parser = new RobotParser(world); + + // parse (synchronously, long-running) + try { + var result = parser.parse(); + logger.info("parsing completed!"); + } catch (MotionGrammarParser.ParseException e) { + throw new RuntimeException(e); + } catch (MotionGrammarParser.ParsingStoppedException ignored) { + logger.info("Parsing stopped"); + } } - parse = new Thread(this::parse); - parse.start(); - } - public void parse() { - System.out.println("starting to parse"); - // create a parser using the world - RobotParser parser = new RobotParser(world); + void stopParsing() { + parser.setShouldStopParsing(true); + } + } - // parse (synchronously, long-running) - try { - var result = parser.parse(); - } catch (MotionGrammarParser.ParseException e) { - throw new RuntimeException(e); + public void startParse() { + if (parse != null && parse.isAlive()) { + parse.stopParsing(); + try { + parse.join(); + } catch (InterruptedException e) { + } } - System.out.println("parsing completed!"); + parse = new ParseThread(); + parse.start(); } public void resetSelections() { diff --git a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java index 6a536e5c3cef1072d2891b9120f9aaa8e3cf36b8..194af22edd8119619b171c86946300fba18b3a1f 100644 --- a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java +++ b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public abstract class MotionGrammarParser<T extends MotionGrammarElement> { @@ -20,12 +21,19 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { protected ASTNode<T> rootContainer_; private int timeStep_; - protected static void waitSomeTime() { + private boolean shouldStopParsing = false; + + public void setShouldStopParsing(boolean value) { + shouldStopParsing = value; + } + + protected void waitSomeTime() { + if (shouldStopParsing) { + throw new ParsingStoppedException(); + } try { - Thread.sleep(100/*ms*/); + TimeUnit.MILLISECONDS.sleep(100); } catch(InterruptedException e) { - System.err.println("received interruption while parsing"); - Thread.currentThread().stop(); } } @@ -113,4 +121,8 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { super("Unable to parse token " + expectedToken.name() + "."); } } + + public static class ParsingStoppedException extends RuntimeException { + /* empty */ + } }