Skip to content
Snippets Groups Projects
Select Git revision
  • 2e6282f0e37cb6bb05d0f9924ae875cc06698694
  • master default protected
2 results

webserver.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    BDefinitionsFinder.java 2.67 KiB
    package de.tla2b.translation;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Set;
    
    import tla2sany.semantic.ASTConstants;
    import tla2sany.semantic.AssumeNode;
    import tla2sany.semantic.ExprNode;
    import tla2sany.semantic.ExprOrOpArgNode;
    import tla2sany.semantic.OpApplNode;
    import tla2sany.semantic.OpDefNode;
    import tlc2.tool.ToolGlobals;
    import de.tla2b.analysis.AbstractASTVisitor;
    import de.tla2b.analysis.BOperation;
    import de.tla2b.analysis.SpecAnalyser;
    import de.tla2b.global.TranslationGlobals;
    
    public class BDefinitionsFinder extends AbstractASTVisitor implements ASTConstants, ToolGlobals, TranslationGlobals {
    	private final HashSet<OpDefNode> bDefinitionsSet = new HashSet<>();
    
    	public BDefinitionsFinder(SpecAnalyser specAnalyser) {
    		if (specAnalyser.getConfigFileEvaluator() != null) {
    			bDefinitionsSet.addAll(specAnalyser.getConfigFileEvaluator().getConstantOverrideTable().values());
    			bDefinitionsSet.addAll(specAnalyser.getConfigFileEvaluator().getOperatorOverrideTable().values());
    		}
    
    		for (BOperation op : specAnalyser.getBOperations()) {
    			visitExprNode(op.getNode());
    			ArrayList<OpApplNode> existQuans = op.getExistQuans();
    			for (OpApplNode opApplNode : existQuans) {
    				ExprNode[] bdedQuantBounds = opApplNode.getBdedQuantBounds();
    				for (ExprNode exprNode : bdedQuantBounds) {
    					visitExprNode(exprNode);
    				}
    			}
    		}
    
    		if (specAnalyser.getInits() != null) {
    			for (int i = 0; i < specAnalyser.getInits().size(); i++) {
    				visitExprNode(specAnalyser.getInits().get(i));
    			}
    		}
    
    		for (AssumeNode assume : specAnalyser.getModuleNode().getAssumptions()) {
    			visitAssumeNode(assume);
    		}
    
    		for (OpDefNode def : specAnalyser.getInvariants()) {
    			bDefinitionsSet.add(def);
    		}
    
    		for (OpDefNode opDef : specAnalyser.getModuleNode().getOpDefs()) {
    			String defName = opDef.getName().toString();
    			// GOAL, ANIMATION_FUNCTION, ANIMATION_IMGxx, SET_PREF_xxx,
    			if (defName.equals("GOAL") || defName.startsWith("ANIMATION_") || defName.startsWith("CUSTOM_GRAPH_")
    					|| defName.startsWith("SET_PREF_") || defName.startsWith("HEURISTIC_FUNCTION")|| defName.startsWith("SCOPE_")) {
    				bDefinitionsSet.add(opDef);
    			}
    		}
    
    		HashSet<OpDefNode> temp = new HashSet<>(bDefinitionsSet);
    		for (OpDefNode opDefNode : temp) {
    			visitExprNode(opDefNode.getBody());
    		}
    
    	}
    
    	@Override
    	public void visitUserDefinedNode(OpApplNode n) {
    		OpDefNode def = (OpDefNode) n.getOperator();
    		if (bDefinitionsSet.add(def)) {
    			// visit body only once
    			visitExprNode(def.getBody());
    		}
    		for (ExprOrOpArgNode exprOrOpArgNode : n.getArgs()) {
    			visitExprOrOpArgNode(exprOrOpArgNode);
    		}
    	}
    
    	public Set<OpDefNode> getBDefinitionsSet() {
    		return bDefinitionsSet;
    	}
    
    }