Skip to content
Snippets Groups Projects
Commit 99c8981d authored by René Schöne's avatar René Schöne
Browse files

add ParsingStoppedException and handle it

parent c173cd8f
Branches
No related tags found
1 merge request!1festival updatesfestival updatesfestival updatesfestival updatesfestival
Pipeline #14652 passed
...@@ -13,6 +13,8 @@ import de.tudresden.inf.st.mg.jastadd.model.JastAddList; ...@@ -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.RobotWorld;
import de.tudresden.inf.st.mg.jastadd.model.Table; import de.tudresden.inf.st.mg.jastadd.model.Table;
import de.tudresden.inf.st.mg.jastadd.model.World; import de.tudresden.inf.st.mg.jastadd.model.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -21,9 +23,12 @@ import java.nio.file.Files; ...@@ -21,9 +23,12 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Comparator; import java.util.Comparator;
import java.util.Random; import java.util.Random;
import java.util.concurrent.TimeUnit;
public class Main { 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"); public static final Path TIDY_AST_DIAGRAM_DIR = Path.of("src", "gen", "resources", "diagrams", "parsing", "tidy");
private final RobotWorld world; private final RobotWorld world;
...@@ -85,28 +90,44 @@ public class Main { ...@@ -85,28 +90,44 @@ public class Main {
} }
private Thread parse; private ParseThread parse;
public void startParse() { class ParseThread extends Thread {
if (parse != null && parse.isAlive()) {
parse.interrupt(); // if not working replace by stop() private RobotParser parser;
}
parse = new Thread(this::parse);
parse.start();
}
public void parse() { @Override
System.out.println("starting to parse"); public void run() {
logger.info("starting to parse");
// create a parser using the world // create a parser using the world
RobotParser parser = new RobotParser(world); parser = new RobotParser(world);
// parse (synchronously, long-running) // parse (synchronously, long-running)
try { try {
var result = parser.parse(); var result = parser.parse();
logger.info("parsing completed!");
} catch (MotionGrammarParser.ParseException e) { } catch (MotionGrammarParser.ParseException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (MotionGrammarParser.ParsingStoppedException ignored) {
logger.info("Parsing stopped");
}
}
void stopParsing() {
parser.setShouldStopParsing(true);
}
} }
System.out.println("parsing completed!");
public void startParse() {
if (parse != null && parse.isAlive()) {
parse.stopParsing();
try {
parse.join();
} catch (InterruptedException e) {
}
}
parse = new ParseThread();
parse.start();
} }
public void resetSelections() { public void resetSelections() {
......
...@@ -12,6 +12,7 @@ import java.util.Arrays; ...@@ -12,6 +12,7 @@ import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public abstract class MotionGrammarParser<T extends MotionGrammarElement> { public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
...@@ -20,12 +21,19 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { ...@@ -20,12 +21,19 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
protected ASTNode<T> rootContainer_; protected ASTNode<T> rootContainer_;
private int timeStep_; 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 { try {
Thread.sleep(100/*ms*/); TimeUnit.MILLISECONDS.sleep(100);
} catch(InterruptedException e) { } catch(InterruptedException e) {
System.err.println("received interruption while parsing");
Thread.currentThread().stop();
} }
} }
...@@ -113,4 +121,8 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { ...@@ -113,4 +121,8 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
super("Unable to parse token " + expectedToken.name() + "."); super("Unable to parse token " + expectedToken.name() + ".");
} }
} }
public static class ParsingStoppedException extends RuntimeException {
/* empty */
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment