XCTLSetStatement.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. //
  2. // XCTLSetStatement.swift
  3. // XCTreeLang
  4. //
  5. // Created by 邢铖 on 2023/6/1.
  6. //
  7. import Foundation
  8. internal class XCTLSetStatement: XCTLStatement {
  9. var type: XCTLStatementType { .typeSet }
  10. var holdingObject: XCTLRuntimeVariable { .void }
  11. var leftStatement: XCTLBackableStatement & XCTLStatement = XCTLVariableRefStatement()
  12. var setToStatement: XCTLStatement!
  13. weak var parent: XCTLStatement?
  14. func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
  15. return try lex.peek().type == .typeSet ? XCTLSetStatement() : nil
  16. }
  17. func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
  18. self.parent = fromParent
  19. try lex.next()
  20. try self.leftStatement.parseStatement(fromLexerToSelf: lex, fromParent: self)
  21. let equalToken = try lex.next()
  22. if equalToken.type != .typeEqual {
  23. throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeEqual.rawValue, butGot: equalToken.type.rawValue)
  24. }
  25. self.setToStatement = try self.parseNextStatement(forLexer: lex, prototypes: XCTLExpressionPrototypes)
  26. }
  27. func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
  28. let value = try self.setToStatement.evaluate(inContext: context)
  29. return try self.leftStatement.evaluateBack(value, inContext: context)
  30. }
  31. }