XCTLImmediateStatement.swift 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //
  2. // XCTLImmediateStatement.swift
  3. // notebook
  4. //
  5. // Created by 邢铖 on 2023/5/18.
  6. //
  7. import Foundation
  8. internal class XCTLImmediateStatement: XCTLStatement, XCTLExpressionPart {
  9. var type: XCTLStatementType { .typeImmediateValue }
  10. var expressionValue: XCTLExpressionValue { .product }
  11. var holdingObject: XCTLRuntimeVariable { .void }
  12. var immediateToken: XCTLToken = .eof
  13. weak var parent: XCTLStatement?
  14. func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
  15. return try (lex.peek().type == .typeImmediateString ||
  16. lex.peek().type == .typeImmediateNumber ||
  17. lex.peek().type == .typeImmediateBool) ? XCTLImmediateStatement() : nil
  18. }
  19. func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
  20. self.parent = fromParent
  21. self.immediateToken = try lex.next()
  22. lex.lastStatement = self
  23. }
  24. func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
  25. var resultValue: XCTLRuntimeVariable
  26. switch immediateToken.type {
  27. case .typeImmediateString:
  28. resultValue = .init(type: .typeString, rawValue: immediateToken.rawValue)
  29. case .typeImmediateNumber:
  30. resultValue = .init(type: .typeNumber, rawValue: immediateToken.rawValue)
  31. case .typeImmediateBool:
  32. resultValue = .init(type: .typeBoolean, rawValue: immediateToken.rawValue)
  33. default:
  34. fatalError()
  35. }
  36. context.variableStack.pushVariable(resultValue)
  37. return resultValue
  38. }
  39. }