Commit 4dbfb023 authored by Alexander Weigl's avatar Alexander Weigl
Browse files

fix bugs from lulu

parent e8a49bad
Pipeline #15832 passed with stages
in 9 minutes and 55 seconds
...@@ -22,6 +22,7 @@ import lombok.Getter; ...@@ -22,6 +22,7 @@ import lombok.Getter;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.security.Key;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -168,12 +169,12 @@ public class InterpreterBuilder { ...@@ -168,12 +169,12 @@ public class InterpreterBuilder {
public InterpreterBuilder ignoreLines(Set<Integer> lines) { public InterpreterBuilder ignoreLines(Set<Integer> lines) {
CommandHandler<KeyData> ignoreHandler = new CommandHandler<KeyData>() { CommandHandler<KeyData> ignoreHandler = new CommandHandler<KeyData>() {
@Override @Override
public boolean handles(CallStatement call) throws IllegalArgumentException { public boolean handles(CallStatement call, KeyData data) throws IllegalArgumentException {
return lines.contains(call.getStartPosition().getLineNumber()); return lines.contains(call.getStartPosition().getLineNumber());
} }
@Override @Override
public void evaluate(Interpreter<KeyData> interpreter, CallStatement call, VariableAssignment params) { public void evaluate(Interpreter<KeyData> interpreter, CallStatement call, VariableAssignment params, KeyData data) {
//System.out.println("InterpreterBuilder.evaluate"); //System.out.println("InterpreterBuilder.evaluate");
} }
}; };
...@@ -184,12 +185,12 @@ public class InterpreterBuilder { ...@@ -184,12 +185,12 @@ public class InterpreterBuilder {
public InterpreterBuilder ignoreLinesUntil(final int caretPosition) { public InterpreterBuilder ignoreLinesUntil(final int caretPosition) {
CommandHandler<KeyData> ignoreHandler = new CommandHandler<KeyData>() { CommandHandler<KeyData> ignoreHandler = new CommandHandler<KeyData>() {
@Override @Override
public boolean handles(CallStatement call) throws IllegalArgumentException { public boolean handles(CallStatement call, KeyData data) throws IllegalArgumentException {
return call.getRuleContext().getStart().getStartIndex() < caretPosition; return call.getRuleContext().getStart().getStartIndex() < caretPosition;
} }
@Override @Override
public void evaluate(Interpreter<KeyData> interpreter, CallStatement call, VariableAssignment params) { public void evaluate(Interpreter<KeyData> interpreter, CallStatement call, VariableAssignment params, KeyData data) {
System.out.println("InterpreterBuilder.evaluate"); System.out.println("InterpreterBuilder.evaluate");
} }
}; };
......
...@@ -245,10 +245,10 @@ public class KeYMatcher implements MatcherApi<KeyData> { ...@@ -245,10 +245,10 @@ public class KeYMatcher implements MatcherApi<KeyData> {
//System.out.println("State that will be matched " + currentState.getData().getNode().sequent() + " with pattern " + data); //System.out.println("State that will be matched " + currentState.getData().getNode().sequent() + " with pattern " + data);
//System.out.println("Signature " + sig.toString()); //System.out.println("Signature " + sig.toString());
Matchings m = MatcherFacade.matches(data, currentState.getData().getNode().sequent()); Matchings m = MatcherFacade.matches(data, currentState.getData().getNode().sequent(), false);
if (m.isEmpty()) { if (m.isEmpty()) {
LOGGER.error("currentState has no match= " + currentState.getData().getNode().sequent()); LOGGER.debug("currentState has no match= " + currentState.getData().getNode().sequent());
return Collections.emptyList(); return Collections.emptyList();
} else { } else {
Map<String, MatchPath> firstMatch = m.first(); Map<String, MatchPath> firstMatch = m.first();
......
...@@ -48,6 +48,7 @@ public class KeyData { ...@@ -48,6 +48,7 @@ public class KeyData {
public KeyData(Goal g, KeYEnvironment environment, Proof proof) { public KeyData(Goal g, KeYEnvironment environment, Proof proof) {
goal = g; goal = g;
node = goal.node();
env = environment; env = environment;
this.proof = proof; this.proof = proof;
closedNode = proof.closed(); closedNode = proof.closed();
......
...@@ -3,8 +3,11 @@ package edu.kit.iti.formal.psdbg.interpreter.exceptions; ...@@ -3,8 +3,11 @@ package edu.kit.iti.formal.psdbg.interpreter.exceptions;
import de.uka.ilkd.key.macros.scripts.RuleCommand; import de.uka.ilkd.key.macros.scripts.RuleCommand;
import java.util.Map; import java.util.Map;
/** /**
* Exception for not applicable Rules * Exception for not applicable rules
*
* @author grebing
*/ */
public class ScriptCommandNotApplicableException extends InterpreterRuntimeException { public class ScriptCommandNotApplicableException extends InterpreterRuntimeException {
...@@ -17,13 +20,16 @@ public class ScriptCommandNotApplicableException extends InterpreterRuntimeExcep ...@@ -17,13 +20,16 @@ public class ScriptCommandNotApplicableException extends InterpreterRuntimeExcep
} }
public ScriptCommandNotApplicableException(Exception e, RuleCommand c, Map<String, String> params) { public ScriptCommandNotApplicableException(Exception e, RuleCommand c, Map<String, String> params) {
StringBuffer sb = new StringBuffer(); super(createMessage(c, params), e);
}
private static String createMessage(RuleCommand c, Map<String, String> params) {
StringBuilder sb = new StringBuilder();
sb.append("Call " + c.getName() + " with parameters "); sb.append("Call " + c.getName() + " with parameters ");
for (String s : params.keySet()) { for (String s : params.keySet()) {
sb.append(s).append(" ").append(params.get(s));
sb.append(s + " " + params.get(s));
} }
sb.append(" was not applicable"); sb.append(" was not applicable");
System.out.println(e.getMessage() + sb.toString()); return sb.toString();
} }
} }
...@@ -4,9 +4,7 @@ import de.uka.ilkd.key.api.KeYApi; ...@@ -4,9 +4,7 @@ import de.uka.ilkd.key.api.KeYApi;
import de.uka.ilkd.key.control.AbstractUserInterfaceControl; import de.uka.ilkd.key.control.AbstractUserInterfaceControl;
import de.uka.ilkd.key.control.DefaultUserInterfaceControl; import de.uka.ilkd.key.control.DefaultUserInterfaceControl;
import de.uka.ilkd.key.macros.ProofMacro; import de.uka.ilkd.key.macros.ProofMacro;
import de.uka.ilkd.key.macros.ProofMacroFinishedInfo;
import de.uka.ilkd.key.proof.Goal; import de.uka.ilkd.key.proof.Goal;
import de.uka.ilkd.key.proof.Node;
import edu.kit.iti.formal.psdbg.interpreter.Interpreter; import edu.kit.iti.formal.psdbg.interpreter.Interpreter;
import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode; import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode;
import edu.kit.iti.formal.psdbg.interpreter.data.KeyData; import edu.kit.iti.formal.psdbg.interpreter.data.KeyData;
...@@ -21,7 +19,6 @@ import org.key_project.util.collection.ImmutableList; ...@@ -21,7 +19,6 @@ import org.key_project.util.collection.ImmutableList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import java.util.Map;
/** /**
...@@ -46,18 +43,21 @@ public class MacroCommandHandler implements CommandHandler<KeyData> { ...@@ -46,18 +43,21 @@ public class MacroCommandHandler implements CommandHandler<KeyData> {
@Override @Override
public boolean handles(CallStatement call) throws IllegalArgumentException { public boolean handles(CallStatement call, KeyData data) throws IllegalArgumentException {
return macros.containsKey(call.getCommand()); return macros.containsKey(call.getCommand());
} }
@Override @Override
public void evaluate(Interpreter<KeyData> interpreter, public void evaluate(Interpreter<KeyData> interpreter,
CallStatement call, CallStatement call,
VariableAssignment params) { VariableAssignment params, KeyData data) {
long startTime = System.currentTimeMillis();
//ProofMacro m = macros.get(call.getCommand()); //ProofMacro m = macros.get(call.getCommand());
ProofMacro macro = KeYApi.getMacroApi().getMacro(call.getCommand()); ProofMacro macro = KeYApi.getMacroApi().getMacro(call.getCommand());
ProofMacroFinishedInfo info = ProofMacroFinishedInfo.getDefaultInfo(macro, /*ProofMacroFinishedInfo info = ProofMacroFinishedInfo.getDefaultInfo(macro,
interpreter.getCurrentState().getSelectedGoalNode().getData().getProof()); interpreter.getCurrentState().getSelectedGoalNode().getData().getProof());
*/
State<KeyData> state = interpreter.getCurrentState(); State<KeyData> state = interpreter.getCurrentState();
GoalNode<KeyData> expandedNode = state.getSelectedGoalNode(); GoalNode<KeyData> expandedNode = state.getSelectedGoalNode();
...@@ -68,37 +68,22 @@ public class MacroCommandHandler implements CommandHandler<KeyData> { ...@@ -68,37 +68,22 @@ public class MacroCommandHandler implements CommandHandler<KeyData> {
//uiControl.taskStarted(new DefaultTaskStartedInfo(TaskStartedInfo.TaskKind.Macro, macro.getName(), 0)); //uiControl.taskStarted(new DefaultTaskStartedInfo(TaskStartedInfo.TaskKind.Macro, macro.getName(), 0));
synchronized (macro) { synchronized (macro) {
AbstractUserInterfaceControl uiControl = new DefaultUserInterfaceControl(); AbstractUserInterfaceControl uiControl = new DefaultUserInterfaceControl();
info = macro.applyTo(uiControl, expandedNode.getData().getNode(), null, uiControl); macro.applyTo(uiControl, expandedNode.getData().getNode(), null, uiControl);
ImmutableList<Goal> ngoals = expandedNode.getData().getProof().getSubtreeGoals(expandedNode.getData().getNode()); ImmutableList<Goal> ngoals = expandedNode.getData().getProof().getSubtreeGoals(expandedNode.getData().getNode());
state.getGoals().remove(expandedNode); state.getGoals().remove(expandedNode);
state.setSelectedGoalNode(null); state.setSelectedGoalNode(null);
if (!ngoals.isEmpty()) {
if (ngoals.isEmpty()) { ngoals.stream()
Node start = expandedNode.getData().getNode(); .map(g -> new KeyData(expandedNode.getData(), g))
//start.leavesIterator() .map(kd -> new GoalNode<>(expandedNode, kd, false))
// Goal s = kd.getProof().getGoal(start); .forEachOrdered(gn -> state.getGoals().add(gn));
Iterator<Node> nodeIterator = start.leavesIterator();
while (nodeIterator.hasNext()) {
Node n = nodeIterator.next();
LOGGER.error(n.isClosed());
}
} else {
for (Goal g : ngoals) {
KeyData kdn = new KeyData(expandedNode.getData(), g.node());
state.getGoals().add(new GoalNode<>(expandedNode, kdn, kdn.isClosedNode()));
}
assert !state.getGoals().contains(expandedNode); assert !state.getGoals().contains(expandedNode);
} }
} }
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally {
LOGGER.debug("Execution of {} took {} ms", call.getCommand(), (System.currentTimeMillis() - startTime));
} }
} }
} }
...@@ -47,7 +47,7 @@ public class ProofScriptCommandBuilder implements CommandHandler<KeyData> { ...@@ -47,7 +47,7 @@ public class ProofScriptCommandBuilder implements CommandHandler<KeyData> {
} }
@Override @Override
public boolean handles(CallStatement call) { public boolean handles(CallStatement call, KeyData data) {
return commands.containsKey(call.getCommand()); return commands.containsKey(call.getCommand());
} }
...@@ -55,7 +55,7 @@ public class ProofScriptCommandBuilder implements CommandHandler<KeyData> { ...@@ -55,7 +55,7 @@ public class ProofScriptCommandBuilder implements CommandHandler<KeyData> {
@Override @Override
public void evaluate(Interpreter<KeyData> interpreter, public void evaluate(Interpreter<KeyData> interpreter,
CallStatement call, CallStatement call,
VariableAssignment params) { VariableAssignment params, KeyData data) {
ProofScriptCommand c = commands.get(call.getCommand()); ProofScriptCommand c = commands.get(call.getCommand());
State<KeyData> state = interpreter.getCurrentState(); State<KeyData> state = interpreter.getCurrentState();
GoalNode<KeyData> expandedNode = state.getSelectedGoalNode(); GoalNode<KeyData> expandedNode = state.getSelectedGoalNode();
......
...@@ -7,12 +7,12 @@ import edu.kit.iti.formal.psdbg.parser.ast.CallStatement; ...@@ -7,12 +7,12 @@ import edu.kit.iti.formal.psdbg.parser.ast.CallStatement;
public class RigidRuleCommandHandler implements CommandHandler<KeyData> { public class RigidRuleCommandHandler implements CommandHandler<KeyData> {
@Override @Override
public boolean handles(CallStatement call) throws IllegalArgumentException { public boolean handles(CallStatement call, KeyData data) throws IllegalArgumentException {
return true; return true;
} }
@Override @Override
public void evaluate(Interpreter<KeyData> interpreter, CallStatement call, VariableAssignment params) { public void evaluate(Interpreter<KeyData> interpreter, CallStatement call, VariableAssignment params, KeyData data) {
// Evaluator evaluator = new Evaluator(g.getAssignments(), g); // Evaluator evaluator = new Evaluator(g.getAssignments(), g);
// evaluator.setMatcher(interpreter.getMatcherApi()); // evaluator.setMatcher(interpreter.getMatcherApi());
......
...@@ -2,11 +2,20 @@ package edu.kit.iti.formal.psdbg.interpreter.funchdl; ...@@ -2,11 +2,20 @@ package edu.kit.iti.formal.psdbg.interpreter.funchdl;
import de.uka.ilkd.key.control.AbstractUserInterfaceControl; import de.uka.ilkd.key.control.AbstractUserInterfaceControl;
import de.uka.ilkd.key.control.DefaultUserInterfaceControl; import de.uka.ilkd.key.control.DefaultUserInterfaceControl;
import de.uka.ilkd.key.java.Services;
import de.uka.ilkd.key.logic.PosInOccurrence;
import de.uka.ilkd.key.logic.PosInTerm;
import de.uka.ilkd.key.logic.SequentFormula;
import de.uka.ilkd.key.macros.scripts.EngineState; import de.uka.ilkd.key.macros.scripts.EngineState;
import de.uka.ilkd.key.macros.scripts.RuleCommand; import de.uka.ilkd.key.macros.scripts.RuleCommand;
import de.uka.ilkd.key.macros.scripts.ScriptException; import de.uka.ilkd.key.macros.scripts.ScriptException;
import de.uka.ilkd.key.proof.Goal; import de.uka.ilkd.key.proof.Goal;
import de.uka.ilkd.key.proof.Proof;
import de.uka.ilkd.key.proof.RuleAppIndex;
import de.uka.ilkd.key.proof.rulefilter.TacletFilter;
import de.uka.ilkd.key.rule.Rule; import de.uka.ilkd.key.rule.Rule;
import de.uka.ilkd.key.rule.Taclet;
import de.uka.ilkd.key.rule.TacletApp;
import edu.kit.iti.formal.psdbg.interpreter.Interpreter; import edu.kit.iti.formal.psdbg.interpreter.Interpreter;
import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode; import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode;
import edu.kit.iti.formal.psdbg.interpreter.data.KeyData; import edu.kit.iti.formal.psdbg.interpreter.data.KeyData;
...@@ -19,9 +28,12 @@ import lombok.RequiredArgsConstructor; ...@@ -19,9 +28,12 @@ import lombok.RequiredArgsConstructor;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.key_project.util.collection.ImmutableList; import org.key_project.util.collection.ImmutableList;
import org.key_project.util.collection.ImmutableSLList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* @author Alexander Weigl * @author Alexander Weigl
...@@ -39,14 +51,49 @@ public class RuleCommandHandler implements CommandHandler<KeyData> { ...@@ -39,14 +51,49 @@ public class RuleCommandHandler implements CommandHandler<KeyData> {
} }
@Override @Override
public boolean handles(CallStatement call) throws IllegalArgumentException { public boolean handles(CallStatement call, KeyData data) throws IllegalArgumentException {
return rules.containsKey(call.getCommand()); if (rules.containsKey(call.getCommand())) return true;//static/rigid rules
if (data != null) {
Goal goal = data.getGoal();
Set<String> rules = findTaclets(data.getProof(), goal);
return rules.contains(call.getCommand());
}
return false;
}
private Set<String> findTaclets(Proof p, Goal g) {
Services services = p.getServices();
TacletFilter filter = new TacletFilter() {
@Override
protected boolean filter(Taclet taclet) {
return true;
}
};
RuleAppIndex index = g.ruleAppIndex();
index.autoModeStopped();
HashSet<String> set = new HashSet<>();
ImmutableList<TacletApp> allApps = ImmutableSLList.nil();
for (SequentFormula sf : g.node().sequent().antecedent()) {
ImmutableList<TacletApp> apps = index.getTacletAppAtAndBelow(filter,
new PosInOccurrence(sf, PosInTerm.getTopLevel(), true),
services);
apps.forEach(t -> set.add(t.taclet().name().toString()));
}
for (SequentFormula sf : g.node().sequent().succedent()) {
ImmutableList<TacletApp> apps = index.getTacletAppAtAndBelow(filter,
new PosInOccurrence(sf, PosInTerm.getTopLevel(), true),
services);
apps.forEach(t -> set.add(t.taclet().name().toString()));
}
return set;
} }
@Override @Override
public void evaluate(Interpreter<KeyData> interpreter, public void evaluate(Interpreter<KeyData> interpreter,
CallStatement call, CallStatement call,
VariableAssignment params) throws IllegalStateException, RuntimeException, ScriptCommandNotApplicableException { VariableAssignment params,
KeyData data) throws RuntimeException, ScriptCommandNotApplicableException {
if (!rules.containsKey(call.getCommand())) { if (!rules.containsKey(call.getCommand())) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<Console name="Console" target="SYSTEM_OUT"> <Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %msg%n"/> <PatternLayout pattern="[%-5level] %msg%n"/>
</Console> </Console>
<File name="F" fileName="debug.log" bufferSize="0" bufferedIO="false"> <File name="F" fileName="debug.log" bufferSize="0" bufferedIO="false" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File> </File>
</Appenders> </Appenders>
......
...@@ -448,9 +448,8 @@ public class Interpreter<T> extends DefaultASTVisitor<Object> ...@@ -448,9 +448,8 @@ public class Interpreter<T> extends DefaultASTVisitor<Object>
MatchEvaluator mEval = new MatchEvaluator(goal.getAssignments(), goal, matcherApi); MatchEvaluator mEval = new MatchEvaluator(goal.getAssignments(), goal, matcherApi);
mEval.getEntryListeners().addAll(getEntryListeners()); mEval.getEntryListeners().addAll(getEntryListeners());
mEval.getExitListeners().addAll(getExitListeners()); mEval.getExitListeners().addAll(getExitListeners());
exitScope(matchExpression);
matchResult = mEval.eval(matchExpression); matchResult = mEval.eval(matchExpression);
exitScope(matchExpression);
} else { } else {
matchResult = new ArrayList<>(); matchResult = new ArrayList<>();
......
...@@ -168,7 +168,7 @@ public class MatchEvaluator extends DefaultASTVisitor<List<VariableAssignment>> ...@@ -168,7 +168,7 @@ public class MatchEvaluator extends DefaultASTVisitor<List<VariableAssignment>>
//TODO extract the results form the matcher in order to retrieve the selection results //TODO extract the results form the matcher in order to retrieve the selection results
} else if (TypeFacade.isTerm(pattern.getType())) { } else if (TypeFacade.isTerm(pattern.getType())) {
va = getMatcher().matchSeq(goal, (String) pattern.getData(), sig); va = getMatcher().matchSeq(goal, (String) pattern.getData(), sig);
System.out.println("va = " + va); // System.out.println("va = " + va);
} }
return va != null ? va : Collections.emptyList(); return va != null ? va : Collections.emptyList();
} }
......
...@@ -150,14 +150,14 @@ public class StateWrapper<T> implements InterpreterObserver<T> { ...@@ -150,14 +150,14 @@ public class StateWrapper<T> implements InterpreterObserver<T> {
private class ExitListener extends DefaultASTVisitor<Void> { private class ExitListener extends DefaultASTVisitor<Void> {
@Override @Override
public Void defaultVisit(ASTNode node) { public Void defaultVisit(ASTNode node) {
LOGGER.error("exit {}", node.accept(new ShortCommandPrinter())); LOGGER.debug("exit {}", node.accept(new ShortCommandPrinter()));
completeLastNode(node); completeLastNode(node);
return null; return null;
} }
@Override @Override
public Void visit(ProofScript proofScript) { public Void visit(ProofScript proofScript) {
LOGGER.error("exit {}", proofScript.accept(new ShortCommandPrinter())); LOGGER.debug("exit {}", proofScript.accept(new ShortCommandPrinter()));
if (proofScript.equals(root)) { if (proofScript.equals(root)) {
createSentinel(); createSentinel();
......
...@@ -23,7 +23,7 @@ public abstract class BuiltinCommands { ...@@ -23,7 +23,7 @@ public abstract class BuiltinCommands {
private final String name; private final String name;
@Override @Override
public boolean handles(CallStatement call) throws IllegalArgumentException { public boolean handles(CallStatement call, T data) throws IllegalArgumentException {
return name.equals(call.getCommand()); return name.equals(call.getCommand());
} }
} }
...@@ -34,7 +34,7 @@ public abstract class BuiltinCommands { ...@@ -34,7 +34,7 @@ public abstract class BuiltinCommands {
} }
@Override @Override
public void evaluate(Interpreter<T> interpreter, CallStatement call, VariableAssignment params) { public void evaluate(Interpreter<T> interpreter, CallStatement call, VariableAssignment params, T data) {
for (GoalNode<T> gn : interpreter.getCurrentGoals()) { for (GoalNode<T> gn : interpreter.getCurrentGoals()) {
System.out.format("%s %s%n %s%n", gn == interpreter.getSelectedNode() ? "*" : " ", gn.getData(), gn.getAssignments().asMap()); System.out.format("%s %s%n %s%n", gn == interpreter.getSelectedNode() ? "*" : " ", gn.getData(), gn.getAssignments().asMap());
} }
...@@ -51,7 +51,7 @@ public abstract class BuiltinCommands { ...@@ -51,7 +51,7 @@ public abstract class BuiltinCommands {
* Created by sarah on 5/17/17. * Created by sarah on 5/17/17.
*/ */
@Override @Override
public void evaluate(Interpreter<String> interpreter, CallStatement call, VariableAssignment params) { public void evaluate(Interpreter<String> interpreter, CallStatement call, VariableAssignment params, String data) {
Value<BigInteger> val = (Value<BigInteger>) params.getValues().getOrDefault( Value<BigInteger> val = (Value<BigInteger>) params.getValues().getOrDefault(
new Variable("#2"), new Variable("#2"),
Value.from(2)); Value.from(2));
......
...@@ -4,6 +4,8 @@ import edu.kit.iti.formal.psdbg.interpreter.Interpreter; ...@@ -4,6 +4,8 @@ import edu.kit.iti.formal.psdbg.interpreter.Interpreter;
import edu.kit.iti.formal.psdbg.interpreter.data.VariableAssignment; import edu.kit.iti.formal.psdbg.interpreter.data.VariableAssignment;
import edu.kit.iti.formal.psdbg.parser.ast.CallStatement; import edu.kit.iti.formal.psdbg.parser.ast.CallStatement;
import javax.annotation.Nullable;
/** /**
* @author Alexander Weigl * @author Alexander Weigl
* @version 1 (20.05.17) * @version 1 (20.05.17)
...@@ -16,16 +18,17 @@ public interface CommandHandler<T> { ...@@ -16,16 +18,17 @@ public interface CommandHandler<T> {
* @return