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
No related branches found
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;
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() {
......
......@@ -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 */
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment