From 99c8981d44998387f4bc833a87b3650709f6fec7 Mon Sep 17 00:00:00 2001 From: rschoene <rene.schoene@tu-dresden.de> Date: Fri, 16 Sep 2022 17:30:29 +0200 Subject: [PATCH] add ParsingStoppedException and handle it --- .../java/de/tudresden/inf/st/mg/Main.java | 55 +++++++++++++------ .../inf/st/mg/common/MotionGrammarParser.java | 20 +++++-- 2 files changed, 54 insertions(+), 21 deletions(-) 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 60829c7..de555c7 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 6a536e5..194af22 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 */ + } } -- GitLab