diff --git a/src/main/java/edu/kit/formal/interpreter/Interpreter.java b/src/main/java/edu/kit/formal/interpreter/Interpreter.java index 8be113e1244896600a6ef51a979aff77426063f0..3d09379952558b8585c65e0c95eb09598a43b77a 100644 --- a/src/main/java/edu/kit/formal/interpreter/Interpreter.java +++ b/src/main/java/edu/kit/formal/interpreter/Interpreter.java @@ -25,7 +25,7 @@ import java.util.logging.Logger; * * @author S.Grebing */ -public class Interpreter extends DefaultASTVisitor +public class Interpreter extends DefaultASTVisitor implements ScopeObservable { private static final int MAX_ITERATIONS = 5; @Getter @@ -79,7 +79,7 @@ public class Interpreter extends DefaultASTVisitor * @return */ @Override - public Void visit(ProofScript proofScript) { + public Object visit(ProofScript proofScript) { enterScope(proofScript); //add vars visit(proofScript.getSignature()); @@ -95,7 +95,7 @@ public class Interpreter extends DefaultASTVisitor * @return */ @Override - public Void visit(AssignmentStatement assignmentStatement) { + public Object visit(AssignmentStatement assignmentStatement) { enterScope(assignmentStatement); GoalNode node = getSelectedNode(); @@ -152,26 +152,92 @@ public class Interpreter extends DefaultASTVisitor return null; } + @Override + public Object visit(IsClosableCase isClosableCase) { + State currentStateToMatch = peekState(); + GoalNode selectedGoal = currentStateToMatch.getSelectedGoalNode(); + enterScope(isClosableCase); + //executebody + + exitScope(isClosableCase); + return false; + } + + @Override + public Object visit(SimpleCaseStatement simpleCaseStatement) { + Expression matchExpression = simpleCaseStatement.getGuard(); + State currentStateToMatch = peekState(); + GoalNode selectedGoal = currentStateToMatch.getSelectedGoalNode(); + VariableAssignment va = evaluateMatchInGoal(matchExpression, selectedGoal); + if (va != null) { + enterScope(simpleCaseStatement); + executeBody(simpleCaseStatement.getBody(), selectedGoal, va); + // executeCase(simpleCaseStatement.getBody(), ) + exitScope(simpleCaseStatement); + return true; + } else { + return false; + } + /* Map, VariableAssignment> matchedGoals = + matchGoal(remainingGoalsSet, (SimpleCaseStatement) aCase); + if (matchedGoals != null) { + remainingGoalsSet.removeAll(matchedGoals.keySet()); + goalsAfterCases.addAll(executeCase(aCase.getBody(), matchedGoals)); + } + + HashMap, VariableAssignment> matchedGoals = new HashMap<>(); + Expression matchExpression = aCase.getGuard(); + for (GoalNode goal : allGoalsBeforeCases) { + VariableAssignment va = evaluateMatchInGoal(matchExpression, goal); + if (va != null) { + matchedGoals.put(goal, va); + } + } + return matchedGoals; + + */ + + } + /** * @param casesStatement * @return */ @Override - public Void visit(CasesStatement casesStatement) { + public Object visit(CasesStatement casesStatement) { enterScope(casesStatement); State beforeCases = peekState(); - List> allGoalsBeforeCases = beforeCases.getGoals(); //global List after all Case Statements List> goalsAfterCases = new ArrayList<>(); //copy the list of goal nodes for keeping track of goals Set> remainingGoalsSet = new HashSet<>(allGoalsBeforeCases); - //TODO //handle cases List cases = casesStatement.getCases(); - for (CaseStatement aCase : cases) { + + for (GoalNode goalBeforeCase : allGoalsBeforeCases) { + State createdState = newState(goalBeforeCase);//to allow the case to retrieve goal + for (CaseStatement aCase : cases) { + boolean result = (boolean) aCase.accept(this); + if (result) { + //remove goal from set for default + remainingGoalsSet.remove(goalBeforeCase); + //case statement matched and was executed + break; + } + } + //remove state from stack + State stateAfterCase = popState(); + if (stateAfterCase.getGoals() != null) { + goalsAfterCases.addAll(stateAfterCase.getGoals()); + } + + } + + //===========================================================================================// + /* for (CaseStatement aCase : cases) { if (aCase.isClosedStmt) { System.out.println("IsClosableStmt not implemented yet"); } else { @@ -183,7 +249,7 @@ public class Interpreter extends DefaultASTVisitor } } - } + }*/ //for all remaining goals execute default if (!remainingGoalsSet.isEmpty()) { @@ -227,14 +293,11 @@ public class Interpreter extends DefaultASTVisitor HashMap, VariableAssignment> matchedGoals = new HashMap<>(); Expression matchExpression = aCase.getGuard(); - - for (GoalNode goal : allGoalsBeforeCases) { VariableAssignment va = evaluateMatchInGoal(matchExpression, goal); if (va != null) { matchedGoals.put(goal, va); } - } return matchedGoals; } @@ -244,7 +307,7 @@ public class Interpreter extends DefaultASTVisitor * * @param matchExpression * @param goal - * @return null, if match was false, return teh first Assignment when match was true + * @return null, if match was false, return the first Assignment when match was true */ private VariableAssignment evaluateMatchInGoal(Expression matchExpression, GoalNode goal) { enterScope(matchExpression); @@ -308,16 +371,6 @@ public class Interpreter extends DefaultASTVisitor return s; } - /** - * @param caseStatement - * @return - */ - /* @Override - public Void visit(CaseStatement caseStatement) { - enterScope(caseStatement); - exitScope(caseStatement); - return null; - }*/ /** * Visiting a call statement results in: @@ -332,7 +385,7 @@ public class Interpreter extends DefaultASTVisitor * @return */ @Override - public Void visit(CallStatement call) { + public Object visit(CallStatement call) { enterScope(call); //neuer VarScope //enter new variable scope @@ -357,7 +410,7 @@ public class Interpreter extends DefaultASTVisitor } @Override - public Void visit(TheOnlyStatement theOnly) { + public Object visit(TheOnlyStatement theOnly) { List> goals = getCurrentState().getGoals(); if (goals.size() > 1) { throw new IllegalArgumentException( @@ -381,7 +434,7 @@ public class Interpreter extends DefaultASTVisitor * @return */ @Override - public Void visit(ForeachStatement foreach) { + public Object visit(ForeachStatement foreach) { enterScope(foreach); List> allGoals = getCurrentGoals(); List> goalsAfterForeach = new ArrayList<>(); @@ -399,7 +452,7 @@ public class Interpreter extends DefaultASTVisitor } @Override - public Void visit(RepeatStatement repeatStatement) { + public Object visit(RepeatStatement repeatStatement) { enterScope(repeatStatement); int counter = 0; boolean b = false; @@ -419,7 +472,7 @@ public class Interpreter extends DefaultASTVisitor } @Override - public Void visit(Signature signature) { + public Object visit(Signature signature) { exitScope(signature); GoalNode node = getSelectedNode(); node.enterScope(); diff --git a/src/main/java/edu/kit/formal/proofscriptparser/TransformAst.java b/src/main/java/edu/kit/formal/proofscriptparser/TransformAst.java index a86c17f7311c1f7afe108aba682172ab214a78dc..5ebf4d9f8a821d1d54bd3d45cbe97507ef343e83 100644 --- a/src/main/java/edu/kit/formal/proofscriptparser/TransformAst.java +++ b/src/main/java/edu/kit/formal/proofscriptparser/TransformAst.java @@ -152,6 +152,11 @@ public class TransformAst implements ScriptLanguageVisitor { return createBinaryExpression(ctx, ctx.expression(), findOperator(ctx.op.getText())); } + @Override + public Object visitExprSubs(ScriptLanguageParser.ExprSubsContext ctx) { + return null; + } + private Operator findOperator(String n) { return findOperator(n, 2); } @@ -215,6 +220,12 @@ public class TransformAst implements ScriptLanguageVisitor { } + //TODO implement + @Override + public Object visitSubstExpression(ScriptLanguageParser.SubstExpressionContext ctx) { + return null; + } + @Override public Object visitLiteralID(ScriptLanguageParser.LiteralIDContext ctx) { return new Variable(ctx.ID().getSymbol()); diff --git a/src/main/resources/edu/kit/formal/gui/intro.html b/src/main/resources/edu/kit/formal/gui/intro.html index 7cad4490938b4a61e9455e81baeb45ff83e64ac7..c58825490e1c194c1826046314254903aa828a6e 100644 --- a/src/main/resources/edu/kit/formal/gui/intro.html +++ b/src/main/resources/edu/kit/formal/gui/intro.html @@ -4,5 +4,260 @@ -Test + +

Language Constructs

+

Proof Commands

+All KeY rules can be used as proof command. + + \ No newline at end of file