XCTLSetStatement.swift 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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.parseNextExpression(forLexer: lex)
  26. lex.lastStatement = self
  27. }
  28. func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
  29. let value = try self.setToStatement.evaluate(inContext: context)
  30. return try self.leftStatement.evaluateBack(value, inContext: context)
  31. }
  32. }