diff --git a/src/main/java/de/tla2b/TLA2B.java b/src/main/java/de/tla2b/TLA2B.java index 4436f6243d1559c369cb7b8cb2702db1788fc50a..b717d538724e05242dc6e6bc61f866f339dd45bc 100644 --- a/src/main/java/de/tla2b/TLA2B.java +++ b/src/main/java/de/tla2b/TLA2B.java @@ -4,11 +4,19 @@ package de.tla2b; +import java.io.File; +import java.io.PrintStream; +import java.io.PrintWriter; + +import de.be4.classicalb.core.parser.BParser; import de.tla2b.exceptions.FrontEndException; import de.tla2b.exceptions.NotImplementedException; import de.tla2b.exceptions.TLA2BException; import de.tla2b.global.TranslationGlobals; import de.tla2bAst.Translator; +import de.be4.classicalb.core.parser.analysis.prolog.RecursiveMachineLoader; +import de.be4.classicalb.core.parser.exceptions.BException; +import de.be4.classicalb.core.parser.node.Start; public class TLA2B implements TranslationGlobals { private String mainFile; @@ -62,6 +70,8 @@ public class TLA2B implements TranslationGlobals { System.exit(-1); } translator.createMachineFile(); + translator.createProbFile(); } + } diff --git a/src/main/java/de/tla2bAst/Translator.java b/src/main/java/de/tla2bAst/Translator.java index 94a1908996f6c64eb8ef41a66fd7c2a60627b502..60950178c119c6be72e91296c6a264b35781277d 100644 --- a/src/main/java/de/tla2bAst/Translator.java +++ b/src/main/java/de/tla2bAst/Translator.java @@ -2,13 +2,18 @@ package de.tla2bAst; import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.PrintWriter; import java.io.Writer; import java.util.Date; +import de.be4.classicalb.core.parser.BParser; import de.be4.classicalb.core.parser.Definitions; +import de.be4.classicalb.core.parser.analysis.prolog.RecursiveMachineLoader; +import de.be4.classicalb.core.parser.exceptions.BException; import de.be4.classicalb.core.parser.node.Start; import de.tla2b.analysis.InstanceTransformation; import de.tla2b.analysis.PredicateVsExpression; @@ -48,10 +53,7 @@ public class Translator implements TranslationGlobals { private SpecAnalyser specAnalyser; private TypeChecker typechecker; - - - - + public Translator(String moduleFileName) throws FrontEndException { this.moduleFileName = moduleFileName; @@ -62,7 +64,8 @@ public class Translator implements TranslationGlobals { } private void findConfigFile() { - String configFileName = FileUtils.removeExtention(moduleFile.getAbsolutePath()); + String configFileName = FileUtils.removeExtention(moduleFile + .getAbsolutePath()); configFileName = configFileName + ".cfg"; configFile = new File(configFileName); if (!configFile.exists()) { @@ -199,10 +202,9 @@ public class Translator implements TranslationGlobals { specAnalyser = SpecAnalyser.createSpecAnalyser(moduleNode); } specAnalyser.start(); - typechecker = new TypeChecker(moduleNode, conEval, - specAnalyser); + typechecker = new TypeChecker(moduleNode, conEval, specAnalyser); typechecker.start(); - + SymbolRenamer symRenamer = new SymbolRenamer(moduleNode, specAnalyser); symRenamer.start(); UsedExternalFunctions usedExternalFunctions = new UsedExternalFunctions( @@ -218,6 +220,35 @@ public class Translator implements TranslationGlobals { return BAst; } + public void createProbFile() { + String fileName = FileUtils.removeExtention(moduleFile + .getAbsolutePath()); + fileName = fileName + ".prob"; + File probFile; + probFile = new File(fileName); + try { + probFile.createNewFile(); + } catch (IOException e) { + System.err.println(String.format("Could not create File %s.", + probFile.getName())); + System.exit(-1); + } + + BParser bParser = new BParser(); + bParser.getDefinitions().addAll(getBDefinitions()); + try { + final RecursiveMachineLoader rml = parseAllMachines(getBAST(), + getModuleFile(), bParser); + //rml.printAsProlog(new PrintWriter(System.out), false); + rml.printAsProlog(new PrintWriter(probFile), false); + System.out.println(probFile.getAbsolutePath() + " created."); + } catch (BException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + public void createMachineFile() { String bFile = FileUtils.removeExtention(moduleFile.getAbsolutePath()); bFile = bFile + "_tla.mch"; @@ -274,21 +305,32 @@ public class Translator implements TranslationGlobals { } - public Start translateExpression(String tlaExpression) throws TLA2BException{ - ExpressionTranslator expressionTranslator = new ExpressionTranslator(tlaExpression, this); + public static RecursiveMachineLoader parseAllMachines(final Start ast, + final File f, final BParser bparser) throws BException { + final RecursiveMachineLoader rml = new RecursiveMachineLoader( + f.getParent(), bparser.getContentProvider()); + + rml.loadAllMachines(f, ast, null, bparser.getDefinitions(), + bparser.getPragmas()); + return rml; + } + + public Start translateExpression(String tlaExpression) + throws TLA2BException { + ExpressionTranslator expressionTranslator = new ExpressionTranslator( + tlaExpression, this); expressionTranslator.parse(); Start start = expressionTranslator.translateIncludingModel(); return start; } - - public static Start translateTlaExpression(String tlaExpression){ - ExpressionTranslator expressionTranslator = new ExpressionTranslator(tlaExpression); + public static Start translateTlaExpression(String tlaExpression) { + ExpressionTranslator expressionTranslator = new ExpressionTranslator( + tlaExpression); expressionTranslator.parse(); expressionTranslator.translate(); return expressionTranslator.getBExpressionParseUnit(); } - public Definitions getBDefinitions() { return bDefinitions; @@ -301,13 +343,21 @@ public class Translator implements TranslationGlobals { public ModuleNode getModuleNode() { return moduleNode; } - - protected TypeChecker getTypeChecker(){ + + protected TypeChecker getTypeChecker() { return this.typechecker; } - protected SpecAnalyser getSpecAnalyser(){ + protected SpecAnalyser getSpecAnalyser() { return this.specAnalyser; } - + + public Start getBAST() { + return BAst; + } + + public File getModuleFile() { + return moduleFile; + } + } diff --git a/src/test/resources/regression/Club/Club.prob b/src/test/resources/regression/Club/Club.prob new file mode 100644 index 0000000000000000000000000000000000000000..8233cd655d1b118e9429e03a39c92318ab25fa41 --- /dev/null +++ b/src/test/resources/regression/Club/Club.prob @@ -0,0 +1,3 @@ +parser_version('2014-03-12 22:57:52.564'). +classical_b('Club',['/Users/hansen/git/tla2bAST/src/test/resources/regression/Club/Club.tla']). +machine(abstract_machine(1,machine(2),machine_header(3,'Club',[]),[sets(4,[enumerated_set(5,'ENUM1',[identifier(6,n1),identifier(7,n2),identifier(8,n3)])]),abstract_constants(9,[identifier(10,capacity),identifier(11,'NAME'),identifier(12,total)]),properties(13,conjunct(14,conjunct(15,conjunct(16,conjunct(17,conjunct(18,member(19,identifier(20,capacity),integer_set(21)),equal(22,identifier(23,'NAME'),identifier(24,'ENUM1'))),member(25,identifier(26,total),integer_set(27))),conjunct(28,member(29,identifier(30,capacity),natural_set(31)),equal(32,identifier(33,capacity),integer(34,2)))),greater(35,card(36,identifier(37,'NAME')),identifier(38,capacity))),conjunct(39,member(40,identifier(41,total),natural_set(42)),greater(43,identifier(44,total),integer(45,2))))),variables(46,[identifier(47,member),identifier(48,waiting)]),invariant(49,conjunct(50,member(51,identifier(52,member),pow_subset(53,identifier(54,'ENUM1'))),member(55,identifier(56,waiting),pow_subset(57,identifier(58,'ENUM1'))))),initialisation(59,becomes_such(60,[identifier(61,member),identifier(62,waiting)],conjunct(63,equal(64,identifier(65,member),empty_set(66)),equal(67,identifier(68,waiting),empty_set(69))))),operations(70,[operation(71,identifier(71,join_queue),[],[identifier(72,nn)],any(73,[identifier(74,member_n)],conjunct(75,conjunct(76,conjunct(77,conjunct(78,conjunct(79,member(80,identifier(81,nn),identifier(82,'NAME')),not_member(83,identifier(84,nn),identifier(85,member))),not_member(86,identifier(87,nn),identifier(88,waiting))),member(89,identifier(90,member_n),pow_subset(91,identifier(92,'ENUM1')))),less(93,card(94,identifier(95,waiting)),identifier(96,total))),equal(97,identifier(98,member_n),identifier(99,member))),assign(100,[identifier(101,waiting),identifier(102,member)],[union(103,identifier(104,waiting),set_extension(105,[identifier(106,nn)])),identifier(107,member_n)]))),operation(108,identifier(108,join),[],[identifier(109,nn)],select(110,conjunct(111,conjunct(112,conjunct(113,member(114,identifier(115,nn),identifier(116,'NAME')),member(117,identifier(118,nn),identifier(119,waiting))),less(120,card(121,identifier(122,member)),identifier(123,capacity))),less(124,card(125,identifier(126,member)),identifier(127,capacity))),assign(128,[identifier(129,member),identifier(130,waiting)],[union(131,identifier(132,member),set_extension(133,[identifier(134,nn)])),minus_or_set_subtract(135,identifier(136,waiting),set_extension(137,[identifier(138,nn)]))]),[])),operation(139,identifier(139,remove),[],[identifier(140,nn)],any(141,[identifier(142,waiting_n)],conjunct(143,conjunct(144,conjunct(145,member(146,identifier(147,nn),identifier(148,'NAME')),member(149,identifier(150,nn),identifier(151,member))),member(152,identifier(153,waiting_n),pow_subset(154,identifier(155,'ENUM1')))),equal(156,identifier(157,waiting_n),identifier(158,waiting))),assign(159,[identifier(160,member),identifier(161,waiting)],[minus_or_set_subtract(162,identifier(163,member),set_extension(164,[identifier(165,nn)])),identifier(166,waiting_n)])))])])).