XCTLContinueStatement.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //
  2. // XCTLContinueStatement.swift
  3. // XCTreeLang
  4. //
  5. // Created by 邢铖 on 2023/6/1.
  6. //
  7. import Foundation
  8. internal class XCTLContinueStatement: XCTLStatement {
  9. var type: XCTLStatementType { .typeContinue }
  10. var holdingObject: XCTLRuntimeVariable { .void }
  11. var parent: XCTLStatement?
  12. func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
  13. if try lex.next().type == .typeContinue {
  14. return XCTLContinueStatement()
  15. }
  16. return nil
  17. }
  18. func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
  19. self.parent = fromParent
  20. var parentStmt = self.parent
  21. var founded = false
  22. while let stmt = parentStmt {
  23. if stmt is XCTLForStatement {
  24. founded = true
  25. }
  26. if stmt is XCTLParagraphStatement {
  27. break
  28. }
  29. parentStmt = stmt.parent
  30. }
  31. if !founded {
  32. throw XCTLCompileTimeError.unexpectParentStatementType(expect: "for", butGot: "...")
  33. }
  34. try _ = lex.next()
  35. lex.lastStatement = self
  36. }
  37. func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
  38. if let listFrame = context.findListFrame() {
  39. listFrame.breakListEvaluate = true
  40. listFrame.breakToParagraph = false
  41. }
  42. return .void
  43. }
  44. }