XCTLElseStatement.swift 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. //
  2. // XCTLElseStatement.swift
  3. // notebook
  4. //
  5. // Created by 邢铖 on 2023/5/25.
  6. //
  7. import Foundation
  8. internal class XCTLElseStatement: XCTLStatement {
  9. var type: XCTLStatementType { .typeElse }
  10. var holdingObject: XCTLRuntimeVariable { .void }
  11. private var listStmts = XCTLListStatement()
  12. weak var parent: XCTLStatement?
  13. weak var condStmt: XCTLConditionParentStatement?
  14. func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
  15. if try lex.next().type == .typeElse {
  16. return XCTLElseStatement()
  17. }
  18. return nil
  19. }
  20. func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
  21. self.parent = fromParent
  22. try lex.next()
  23. guard let parent = fromParent as? XCTLListStatementProtocol,
  24. let condStmt = parent.conditionParent else {
  25. throw XCTLCompileTimeError.unexpectParentStatementType(expect: "listStatements", butGot: "\(fromParent?.type.rawValue ?? "none")")
  26. }
  27. self.condStmt = condStmt
  28. try listStmts.parseStatement(fromLexerToSelf: lex, fromParent: self)
  29. }
  30. func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
  31. guard let condFrame = context.findConditionFrame() else {
  32. throw XCTLRuntimeError.invalidConditionFrame
  33. }
  34. if condFrame.doElse {
  35. return try self.listStmts.evaluate(inContext: context)
  36. }
  37. return .void
  38. }
  39. }