Skip to content
Snippets Groups Projects
Commit a8418bab authored by hansen's avatar hansen
Browse files

Translating an expression associated to module

parent 89f1e7e0
No related branches found
No related tags found
No related merge requests found
...@@ -41,6 +41,10 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, ...@@ -41,6 +41,10 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
private OpDefNode next; private OpDefNode next;
private ArrayList<OpDefNode> invariants = new ArrayList<OpDefNode>(); private ArrayList<OpDefNode> invariants = new ArrayList<OpDefNode>();
private OpDefNode expressionOpdefNode;
private Hashtable<String, SymbolNode> namingHashTable = new Hashtable<String, SymbolNode>();
private final ModuleNode moduleNode; private final ModuleNode moduleNode;
private ExprNode nextExpr; private ExprNode nextExpr;
...@@ -85,11 +89,13 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, ...@@ -85,11 +89,13 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
} }
public static SpecAnalyser createSpecAnalyserForTlaExpression(ModuleNode m){ public static SpecAnalyser createSpecAnalyserForTlaExpression(ModuleNode m){
SpecAnalyser specAnalyser = new SpecAnalyser(m); SpecAnalyser specAnalyser = new SpecAnalyser(m);
OpDefNode expr = m.getOpDefs()[m.getOpDefs().length-1];
specAnalyser.usedDefinitions.add(expr); specAnalyser.expressionOpdefNode = m.getOpDefs()[m.getOpDefs().length-1];
specAnalyser.bDefinitionsSet.add(expr); specAnalyser.usedDefinitions.add(specAnalyser.expressionOpdefNode);
specAnalyser.bDefinitionsSet.add(specAnalyser.expressionOpdefNode);
return specAnalyser; return specAnalyser;
} }
...@@ -161,6 +167,19 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, ...@@ -161,6 +167,19 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
} }
} }
findRecursiveConstructs(); findRecursiveConstructs();
for (OpDeclNode var : moduleNode.getVariableDecls()) {
namingHashTable.put(var.getName().toString(), var);
}
for (OpDeclNode con : moduleNode.getConstantDecls()) {
namingHashTable.put(con.getName().toString(), con);
}
for (OpDefNode def : usedDefinitions) {
namingHashTable.put(def.getName().toString(), def);
}
} }
private void evalInit() { private void evalInit() {
...@@ -309,4 +328,12 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, ...@@ -309,4 +328,12 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
return init; return init;
} }
public OpDefNode getExpressionOpdefNode(){
return expressionOpdefNode;
}
public SymbolNode getSymbolNodeByName(String name){
return namingHashTable.get(name);
}
} }
...@@ -54,6 +54,7 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants, ...@@ -54,6 +54,7 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants,
// every record node [a |-> 1 .. ] will be added to this List // every record node [a |-> 1 .. ] will be added to this List
private ModuleNode moduleNode; private ModuleNode moduleNode;
private ArrayList<OpDeclNode> bConstList; private ArrayList<OpDeclNode> bConstList;
private SpecAnalyser specAnalyser;
private Hashtable<OpDeclNode, ValueObj> constantAssignments; private Hashtable<OpDeclNode, ValueObj> constantAssignments;
...@@ -67,6 +68,7 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants, ...@@ -67,6 +68,7 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants,
public TypeChecker(ModuleNode moduleNode, ConfigfileEvaluator conEval, public TypeChecker(ModuleNode moduleNode, ConfigfileEvaluator conEval,
SpecAnalyser specAnalyser) { SpecAnalyser specAnalyser) {
this.moduleNode = moduleNode; this.moduleNode = moduleNode;
this.specAnalyser= specAnalyser;
if (conEval != null) { if (conEval != null) {
this.bConstList = conEval.getbConstantList(); this.bConstList = conEval.getbConstantList();
this.constantAssignments = conEval.getConstantAssignments(); this.constantAssignments = conEval.getConstantAssignments();
...@@ -79,9 +81,9 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants, ...@@ -79,9 +81,9 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants,
paramId = TYPE_ID; paramId = TYPE_ID;
} }
public TypeChecker(ModuleNode moduleNode) { public TypeChecker(ModuleNode moduleNode, SpecAnalyser specAnalyser) {
this.moduleNode = moduleNode; this.moduleNode = moduleNode;
this.specAnalyser = specAnalyser;
Set<OpDefNode> usedDefinitions = new HashSet<OpDefNode>(); Set<OpDefNode> usedDefinitions = new HashSet<OpDefNode>();
OpDefNode[] defs = moduleNode.getOpDefs(); OpDefNode[] defs = moduleNode.getOpDefs();
// used the last definition of the module // used the last definition of the module
...@@ -229,7 +231,7 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants, ...@@ -229,7 +231,7 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants,
* @param def * @param def
* @throws TLA2BException * @throws TLA2BException
*/ */
private void visitOpDefNode(OpDefNode def) throws TLA2BException { public void visitOpDefNode(OpDefNode def) throws TLA2BException {
FormalParamNode[] params = def.getParams(); FormalParamNode[] params = def.getParams();
for (int i = 0; i < params.length; i++) { for (int i = 0; i < params.length; i++) {
FormalParamNode p = params[i]; FormalParamNode p = params[i];
...@@ -386,8 +388,16 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants, ...@@ -386,8 +388,16 @@ public class TypeChecker extends BuiltInOPs implements IType, ASTConstants,
String vName = symbolNode.getName().toString(); String vName = symbolNode.getName().toString();
TLAType v = (TLAType) symbolNode.getToolObject(TYPE_ID); TLAType v = (TLAType) symbolNode.getToolObject(TYPE_ID);
if (v == null) { if (v == null) {
SymbolNode var = this.specAnalyser.getSymbolNodeByName(vName);
if(var != null){
// symbolNode is variable of an expression, e.g. v + 1
v = (TLAType) var.getToolObject(TYPE_ID);
}else{
throw new RuntimeException(vName + " has no type yet!"); throw new RuntimeException(vName + " has no type yet!");
} }
}
try { try {
TLAType result = expected.unify(v); TLAType result = expected.unify(v);
symbolNode.setToolObject(TYPE_ID, result); symbolNode.setToolObject(TYPE_ID, result);
......
...@@ -120,7 +120,7 @@ public class ExpressionTranslatorOld implements SyntaxTreeConstants { ...@@ -120,7 +120,7 @@ public class ExpressionTranslatorOld implements SyntaxTreeConstants {
ModuleNode moduleNode = parseModule(moduleName, expr); ModuleNode moduleNode = parseModule(moduleName, expr);
TypeChecker tc = new TypeChecker(moduleNode); TypeChecker tc = null;//= new TypeChecker(moduleNode);
try { try {
tc.start(); tc.start();
} catch (TLA2BException e) { } catch (TLA2BException e) {
......
...@@ -17,7 +17,6 @@ import tla2sany.semantic.ModuleNode; ...@@ -17,7 +17,6 @@ import tla2sany.semantic.ModuleNode;
import tla2sany.st.SyntaxTreeConstants; import tla2sany.st.SyntaxTreeConstants;
import tla2sany.st.TreeNode; import tla2sany.st.TreeNode;
import util.ToolIO; import util.ToolIO;
import de.be4.classicalb.core.parser.node.AExpressionParseUnit;
import de.be4.classicalb.core.parser.node.Start; import de.be4.classicalb.core.parser.node.Start;
import de.tla2b.analysis.SpecAnalyser; import de.tla2b.analysis.SpecAnalyser;
import de.tla2b.analysis.SymbolRenamer; import de.tla2b.analysis.SymbolRenamer;
...@@ -31,17 +30,24 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -31,17 +30,24 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
private final ArrayList<String> variables = new ArrayList<String>(); private final ArrayList<String> variables = new ArrayList<String>();
private final ArrayList<String> noVariables = new ArrayList<String>(); private final ArrayList<String> noVariables = new ArrayList<String>();
private Start expressionStart; private Start expressionStart;
private ModuleNode moduleNode;
private String expr;
private Translator translator;
public Start getBExpressionParseUnit() { public Start getBExpressionParseUnit() {
return expressionStart; return expressionStart;
} }
public ExpressionTranslator(String tlaExpression) { public ExpressionTranslator(String tlaExpression) {
this.tlaExpression = tlaExpression; this.tlaExpression = tlaExpression;
} }
public void start(){ public ExpressionTranslator(String tlaExpression, Translator translator) {
this.tlaExpression = tlaExpression;
this.translator = translator;
}
public void parse() {
String dir = System.getProperty("java.io.tmpdir"); String dir = System.getProperty("java.io.tmpdir");
ToolIO.setUserDir(dir); ToolIO.setUserDir(dir);
...@@ -54,8 +60,8 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -54,8 +60,8 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
moduleName = tempFile.getName().substring(0, moduleName = tempFile.getName().substring(0,
tempFile.getName().indexOf(".")); tempFile.getName().indexOf("."));
module = "----MODULE " + moduleName + " ----\n" module = "----MODULE " + moduleName + " ----\n" + "Expression == "
+ "Expression == " + tlaExpression + "\n===="; + tlaExpression + "\n====";
FileWriter fw = new FileWriter(tempFile); FileWriter fw = new FileWriter(tempFile);
fw.write(module); fw.write(module);
...@@ -86,7 +92,6 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -86,7 +92,6 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
sb.append(tlaExpression); sb.append(tlaExpression);
sb.append("\n===================="); sb.append("\n====================");
try { try {
FileWriter fw = new FileWriter(tempFile); FileWriter fw = new FileWriter(tempFile);
fw.write(sb.toString()); fw.write(sb.toString());
...@@ -97,26 +102,43 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -97,26 +102,43 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
throw new RuntimeException(e.getMessage()); throw new RuntimeException(e.getMessage());
} }
ToolIO.reset(); ToolIO.reset();
expressionStart = translate(moduleName, sb.toString());
}
this.expr = sb.toString();
private static Start translate(String moduleName, String expr) { this.moduleNode = null;
ModuleNode moduleNode = null;
try { try {
moduleNode = parseModule(moduleName, expr); moduleNode = parseModule(moduleName, sb.toString());
} catch (de.tla2b.exceptions.FrontEndException e) { } catch (de.tla2b.exceptions.FrontEndException e) {
throw new RuntimeException(e.getLocalizedMessage()); throw new RuntimeException(e.getLocalizedMessage());
} }
}
public Start translateIncludingModel() throws TLA2BException{
SpecAnalyser specAnalyser = SpecAnalyser
.createSpecAnalyserForTlaExpression(moduleNode);
TypeChecker tc = translator.getTypeChecker();
tc.visitOpDefNode(specAnalyser.getExpressionOpdefNode());
SpecAnalyser specAnalyser = SpecAnalyser.createSpecAnalyserForTlaExpression(moduleNode);
TypeChecker tc = new TypeChecker(moduleNode); SymbolRenamer symRenamer = new SymbolRenamer(moduleNode, specAnalyser);
symRenamer.start();
BAstCreator bASTCreator = new BAstCreator(moduleNode, specAnalyser);
this.expressionStart = bASTCreator.expressionStart;
return this.expressionStart;
}
public Start translate() {
SpecAnalyser specAnalyser = SpecAnalyser
.createSpecAnalyserForTlaExpression(moduleNode);
TypeChecker tc = new TypeChecker(moduleNode, specAnalyser);
try { try {
tc.start(); tc.start();
} catch (TLA2BException e) { } catch (TLA2BException e) {
// String[] m = ToolIO.getAllMessages(); // String[] m = ToolIO.getAllMessages();
String message = "****TypeError****\n" String message = "****TypeError****\n" + e.getLocalizedMessage()
+ e.getLocalizedMessage() + "\n" + expr + "\n"; + "\n" + expr + "\n";
// System.out.println(message); // System.out.println(message);
throw new RuntimeException(message); throw new RuntimeException(message);
} }
...@@ -125,7 +147,8 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -125,7 +147,8 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
symRenamer.start(); symRenamer.start();
BAstCreator bASTCreator = new BAstCreator(moduleNode, specAnalyser); BAstCreator bASTCreator = new BAstCreator(moduleNode, specAnalyser);
return bASTCreator.expressionStart; this.expressionStart = bASTCreator.expressionStart;
return this.expressionStart;
} }
public static ModuleNode parseModule(String moduleName, String module) public static ModuleNode parseModule(String moduleName, String module)
...@@ -140,8 +163,7 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -140,8 +163,7 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
if (spec.parseErrors.isFailure()) { if (spec.parseErrors.isFailure()) {
// String[] m = ToolIO.getAllMessages(); // String[] m = ToolIO.getAllMessages();
String message = module + "\n\n" String message = module + "\n\n" + spec.parseErrors;
+ spec.parseErrors;
// System.out.println(spec.parseErrors); // System.out.println(spec.parseErrors);
message += Tla2BTranslator.allMessagesToString(ToolIO message += Tla2BTranslator.allMessagesToString(ToolIO
.getAllMessages()); .getAllMessages());
...@@ -176,13 +198,12 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -176,13 +198,12 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
return n; return n;
} }
/** /**
* @param moduleFileName * @param moduleFileName
* @throws de.tla2b.exceptions.FrontEndException * @throws de.tla2b.exceptions.FrontEndException
*/ */
private SpecObj parseModuleWithoutSemanticAnalyse(String moduleFileName, String module) private SpecObj parseModuleWithoutSemanticAnalyse(String moduleFileName,
{ String module) {
SpecObj spec = new SpecObj(moduleFileName, null); SpecObj spec = new SpecObj(moduleFileName, null);
try { try {
...@@ -205,8 +226,6 @@ public class ExpressionTranslator implements SyntaxTreeConstants{ ...@@ -205,8 +226,6 @@ public class ExpressionTranslator implements SyntaxTreeConstants{
return spec; return spec;
} }
/** /**
* @param spec * @param spec
* @return * @return
......
...@@ -44,9 +44,14 @@ public class Translator implements TranslationGlobals { ...@@ -44,9 +44,14 @@ public class Translator implements TranslationGlobals {
// private String moduleName; // private String moduleName;
private ModuleNode moduleNode; private ModuleNode moduleNode;
private ModelConfig modelConfig; private ModelConfig modelConfig;
private String bMachineString; private String bMachineString;
private SpecAnalyser specAnalyser;
private TypeChecker typechecker;
public Translator(String moduleFileName) throws FrontEndException { public Translator(String moduleFileName) throws FrontEndException {
this.moduleFileName = moduleFileName; this.moduleFileName = moduleFileName;
...@@ -181,8 +186,6 @@ public class Translator implements TranslationGlobals { ...@@ -181,8 +186,6 @@ public class Translator implements TranslationGlobals {
PredicateVsExpression predicateVsExpression = new PredicateVsExpression( PredicateVsExpression predicateVsExpression = new PredicateVsExpression(
moduleNode); moduleNode);
SpecAnalyser specAnalyser;
ConfigfileEvaluator conEval = null; ConfigfileEvaluator conEval = null;
if (modelConfig != null) { if (modelConfig != null) {
...@@ -196,7 +199,7 @@ public class Translator implements TranslationGlobals { ...@@ -196,7 +199,7 @@ public class Translator implements TranslationGlobals {
specAnalyser = SpecAnalyser.createSpecAnalyser(moduleNode); specAnalyser = SpecAnalyser.createSpecAnalyser(moduleNode);
} }
specAnalyser.start(); specAnalyser.start();
TypeChecker typechecker = new TypeChecker(moduleNode, conEval, typechecker = new TypeChecker(moduleNode, conEval,
specAnalyser); specAnalyser);
typechecker.start(); typechecker.start();
...@@ -271,10 +274,18 @@ public class Translator implements TranslationGlobals { ...@@ -271,10 +274,18 @@ public class Translator implements TranslationGlobals {
} }
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){ public static Start translateTlaExpression(String tlaExpression){
ExpressionTranslator expressionTranslator = new ExpressionTranslator(tlaExpression); ExpressionTranslator expressionTranslator = new ExpressionTranslator(tlaExpression);
expressionTranslator.start(); expressionTranslator.parse();
expressionTranslator.translate();
return expressionTranslator.getBExpressionParseUnit(); return expressionTranslator.getBExpressionParseUnit();
} }
...@@ -291,4 +302,12 @@ public class Translator implements TranslationGlobals { ...@@ -291,4 +302,12 @@ public class Translator implements TranslationGlobals {
return moduleNode; return moduleNode;
} }
protected TypeChecker getTypeChecker(){
return this.typechecker;
}
protected SpecAnalyser getSpecAnalyser(){
return this.specAnalyser;
}
} }
package de.tla2b.expression;
import static de.tla2b.util.TestUtil.compareExprIncludingModel;
import org.junit.Test;
import de.tla2b.exceptions.TypeErrorException;
public class ModuleAndExpressionTest {
@Test
public void testCon() throws Exception {
String module = "---- MODULE Testing ----\n" + "CONSTANTS k \n"
+ "ASSUME k = 4" + "===============";
compareExprIncludingModel("bool(k = 1)", "k = 1", module);
}
@Test(expected = TypeErrorException.class)
public void testTypeError() throws Exception {
String module = "---- MODULE Testing ----\n" + "CONSTANTS k \n"
+ "ASSUME k = 4" + "===============";
compareExprIncludingModel(null, "k = TRUE", module);
}
}
...@@ -74,6 +74,13 @@ public class TestUtil { ...@@ -74,6 +74,13 @@ public class TestUtil {
assertEquals(bAstString, result); assertEquals(bAstString, result);
} }
public static void compareExprIncludingModel(String bExpr, String tlaExpr, String moduleString) throws TLA2BException{
Translator trans = new Translator(moduleString, null);
trans.translate();
Start result = trans.translateExpression(tlaExpr);
}
public static void compare(String bMachine, String tlaModule) throws BException, TLA2BException{ public static void compare(String bMachine, String tlaModule) throws BException, TLA2BException{
ToolIO.setMode(ToolIO.TOOL); ToolIO.setMode(ToolIO.TOOL);
......
/*@ generated by TLA2B 1.0.7 Fri May 09 15:38:02 CEST 2014 */ /*@ generated by TLA2B 1.0.7 Fri May 09 16:29:56 CEST 2014 */
MACHINE Club MACHINE Club
SETS ENUM1 = {n1, n2, n3} SETS ENUM1 = {n1, n2, n3}
ABSTRACT_CONSTANTS capacity, NAME, total ABSTRACT_CONSTANTS capacity, NAME, total
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment