diff --git a/src/main/java/de/tlc4b/analysis/MachineContext.java b/src/main/java/de/tlc4b/analysis/MachineContext.java index d1e41ff0e70439af11f7f595377b8db76a566897..aa242f56283545108685a40ded53cce155adba98 100644 --- a/src/main/java/de/tlc4b/analysis/MachineContext.java +++ b/src/main/java/de/tlc4b/analysis/MachineContext.java @@ -92,7 +92,7 @@ public class MachineContext extends DepthFirstAdapter { private LinkedHashMap<String, Node> constants; private final LinkedHashMap<String, Node> bMachineConstants; - + private final LinkedHashMap<String, Node> variables; private final LinkedHashMap<String, Node> definitions; private final LinkedHashMap<String, Node> operations; @@ -114,8 +114,6 @@ public class MachineContext extends DepthFirstAdapter { protected final Hashtable<Node, Node> referencesTable; - - public MachineContext(String machineName, Start start, String ltlFormula, PPredicate constantsSetup) { this.start = start; @@ -126,7 +124,8 @@ public class MachineContext extends DepthFirstAdapter { LTLFormulaVisitor ltlVisitor = null; if (null != ltlFormula) { - ltlVisitor = new LTLFormulaVisitor("ltl", ltlFormula, this); + ltlVisitor = new LTLFormulaVisitor("ltl", this); + ltlVisitor.parseLTLString(ltlFormula); this.ltlVisitors.add(ltlVisitor); } @@ -298,16 +297,10 @@ public class MachineContext extends DepthFirstAdapter { AExpressionDefinitionDefinition def = (AExpressionDefinitionDefinition) e; String name = def.getName().getText(); if (name.startsWith("ASSERT_LTL")) { - try { - AStringExpression stringNode = (AStringExpression) def - .getRhs(); - LTLFormulaVisitor visitor = new LTLFormulaVisitor(name, - stringNode.getContent().getText(), this); - this.ltlVisitors.add(visitor); - } catch (ClassCastException castException) { - throw new ScopeException( - "Error: LTL formula is not in a string representation."); - } + LTLFormulaVisitor visitor = new LTLFormulaVisitor(name, this); + visitor.parseDefinition(def); + this.ltlVisitors.add(visitor); + definitionsToRemove.add(def); } else if (name.startsWith("ANIMATION_")) { definitionsToRemove.add(def); diff --git a/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java b/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java index e8befd7778f176842a1678061824aff13c539c40..ed50c8f38887093c115d40bcd86134919c6540ca 100644 --- a/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java +++ b/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java @@ -1,5 +1,6 @@ package de.tlc4b.ltl; +import java.io.IOException; import java.io.PushbackReader; import java.io.StringReader; import java.util.ArrayList; @@ -10,12 +11,15 @@ import java.util.List; import de.be4.classicalb.core.parser.BParser; import de.be4.classicalb.core.parser.exceptions.BException; +import de.be4.classicalb.core.parser.node.AExpressionDefinitionDefinition; import de.be4.classicalb.core.parser.node.AIdentifierExpression; +import de.be4.classicalb.core.parser.node.AStringExpression; import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; import de.be4.ltl.core.parser.analysis.DepthFirstAdapter; import de.be4.ltl.core.parser.internal.LtlLexer; import de.be4.ltl.core.parser.lexer.Lexer; +import de.be4.ltl.core.parser.lexer.LexerException; import de.be4.ltl.core.parser.node.AActionLtl; import de.be4.ltl.core.parser.node.AEnabledLtl; import de.be4.ltl.core.parser.node.AExistsLtl; @@ -34,6 +38,7 @@ import de.be4.ltl.core.parser.node.AYesterdayLtl; import de.be4.ltl.core.parser.node.PLtl; import de.be4.ltl.core.parser.node.Start; import de.be4.ltl.core.parser.parser.Parser; +import de.be4.ltl.core.parser.parser.ParserException; import de.tlc4b.analysis.MachineContext; import de.tlc4b.analysis.typerestriction.TypeRestrictor; import de.tlc4b.exceptions.LTLParseException; @@ -43,31 +48,49 @@ import de.tlc4b.prettyprint.TLAPrinter; public class LTLFormulaVisitor extends DepthFirstAdapter { private final String name; - private final Start ltlFormulaStart; private final MachineContext machineContext; - + private String ltlFormula; + private Start ltlFormulaStart; + private final LinkedHashMap<de.be4.ltl.core.parser.node.Node, de.be4.classicalb.core.parser.node.Node> ltlNodeToBNodeTable; private final ArrayList<LTLBPredicate> bPredicates; private final Hashtable<String, AIdentifierExpression> ltlIdentifierTable; private ArrayList<Hashtable<String, AIdentifierExpression>> contextTable; - - public LTLFormulaVisitor(String name, String ltlFormula, - MachineContext machineContext) { + public LTLFormulaVisitor(String name, MachineContext machineContext) { this.name = name; - this.ltlFormulaStart = parse(ltlFormula); this.machineContext = machineContext; - this.bPredicates = new ArrayList<LTLBPredicate>(); this.ltlNodeToBNodeTable = new LinkedHashMap<de.be4.ltl.core.parser.node.Node, de.be4.classicalb.core.parser.node.Node>(); this.ltlIdentifierTable = new Hashtable<String, AIdentifierExpression>(); - this.contextTable = new ArrayList<Hashtable<String, AIdentifierExpression>>(); - } - - + + public void parseDefinition(AExpressionDefinitionDefinition def) { + if (!(def.getRhs() instanceof AStringExpression)) { + throw new LTLParseException( + "Error: LTL formula is not in a string representation."); + } + AStringExpression stringNode = (AStringExpression) def.getRhs(); + this.ltlFormula = stringNode.getContent().getText(); + try { + this.ltlFormulaStart = parse(ltlFormula); + } catch (Exception e) { + String line = "Parsing definition " + name + " (line " + + def.getStartPos().getLine() + "):\n"; + throw new LTLParseException(line + e.getMessage()); + } + } + + public void parseLTLString(String ltlString) { + try { + this.ltlFormulaStart = parse(ltlFormula); + } catch (Exception e) { + throw new LTLParseException(e.getMessage()); + } + } + public ArrayList<LTLBPredicate> getBPredicates() { return bPredicates; } @@ -101,24 +124,20 @@ public class LTLFormulaVisitor extends DepthFirstAdapter { return ltlFormulaStart; } - public void printLTLFormula(TLAPrinter tlaPrinter, TypeRestrictor typeRestrictor) { + public void printLTLFormula(TLAPrinter tlaPrinter, + TypeRestrictor typeRestrictor) { // LTLFormulaPrinter ltlFormulaPrinter = new LTLFormulaPrinter(tlaPrinter, this, typeRestrictor); } - public static Start parse(String ltlFormula) { + public static Start parse(String ltlFormula) throws ParserException, + LexerException, IOException { StringReader reader = new StringReader(ltlFormula); PushbackReader r = new PushbackReader(reader); Lexer l = new LtlLexer(r); Parser p = new Parser(l); Start ast = null; - try { - ast = p.parse(); - - } catch (Exception e) { - e.printStackTrace(); - throw new LTLParseException(e.getMessage()); - } + ast = p.parse(); return ast; } diff --git a/src/test/java/testing/Testing2.java b/src/test/java/testing/Testing2.java index 40596ce62bf46f32ea3c96e9a04031c6b4d2367f..4a936a7b82e06041d5f131e6470d3ff5215bea27 100644 --- a/src/test/java/testing/Testing2.java +++ b/src/test/java/testing/Testing2.java @@ -28,7 +28,7 @@ public class Testing2 extends AbstractParseMachineTest { @Test public void testRunTLC() throws Exception { - String[] a = new String[] { machine.getPath() }; + String[] a = new String[] { machine.getPath(), "-nodead", "-noinv" }; TLC4B.main(a); //TLC4B.test(a, false); // test(a);