IfStatement.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package org.ssssssss.script.parsing.ast;
  2. import org.ssssssss.script.MagicScriptContext;
  3. import org.ssssssss.script.MagicScriptError;
  4. import org.ssssssss.script.interpreter.AstInterpreter;
  5. import org.ssssssss.script.parsing.Span;
  6. import java.util.List;
  7. public class IfStatement extends Node {
  8. private final Expression condition;
  9. private final List<Node> trueBlock;
  10. private final List<IfStatement> elseIfs;
  11. private final List<Node> falseBlock;
  12. public IfStatement(Span span, Expression condition, List<Node> trueBlock, List<IfStatement> elseIfs, List<Node> falseBlock) {
  13. super(span);
  14. this.condition = condition;
  15. this.trueBlock = trueBlock;
  16. this.elseIfs = elseIfs;
  17. this.falseBlock = falseBlock;
  18. }
  19. public Expression getCondition() {
  20. return condition;
  21. }
  22. public List<Node> getTrueBlock() {
  23. return trueBlock;
  24. }
  25. public List<IfStatement> getElseIfs() {
  26. return elseIfs;
  27. }
  28. public List<Node> getFalseBlock() {
  29. return falseBlock;
  30. }
  31. @Override
  32. public Object evaluate(MagicScriptContext context) {
  33. Object condition = getCondition().evaluate(context);
  34. if (!(condition instanceof Boolean))
  35. MagicScriptError.error("Expected a condition evaluating to a boolean, got " + condition, getCondition().getSpan());
  36. if ((Boolean) condition) {
  37. context.push();
  38. Object breakOrContinueOrReturn = AstInterpreter.interpretNodeList(getTrueBlock(), context);
  39. context.pop();
  40. return breakOrContinueOrReturn;
  41. }
  42. if (getElseIfs().size() > 0) {
  43. for (IfStatement elseIf : getElseIfs()) {
  44. condition = elseIf.getCondition().evaluate(context);
  45. if (!(condition instanceof Boolean))
  46. MagicScriptError.error("Expected a condition evaluating to a boolean, got " + condition, elseIf.getCondition().getSpan());
  47. if ((Boolean) condition) {
  48. context.push();
  49. Object breakOrContinueOrReturn = AstInterpreter.interpretNodeList(elseIf.getTrueBlock(), context);
  50. context.pop();
  51. return breakOrContinueOrReturn;
  52. }
  53. }
  54. }
  55. if (getFalseBlock().size() > 0) {
  56. context.push();
  57. Object breakOrContinueOrReturn = AstInterpreter.interpretNodeList(getFalseBlock(), context);
  58. context.pop();
  59. return breakOrContinueOrReturn;
  60. }
  61. return null;
  62. }
  63. }