XCTLStatement.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // XCTLStatement.swift
  3. // notebook
  4. //
  5. // Created by 邢铖 on 2023/5/18.
  6. //
  7. import Foundation
  8. internal protocol XCTLStatement: AnyObject {
  9. var type: XCTLStatementType { get }
  10. /// 例如,switch语句正在判断的对象,可以为void
  11. var holdingObject: XCTLRuntimeVariable { get }
  12. var parent: XCTLStatement? { get }
  13. /// 判断Lex状态是否符合当前表达式
  14. func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement?
  15. func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws
  16. func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable
  17. // func evaluateAfter(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable
  18. }
  19. internal protocol XCTLListStatementProtocol: AnyObject {
  20. var conditionParent: XCTLConditionParentStatement? { get }
  21. var paragraphHold: Bool { get set }
  22. }
  23. internal protocol XCTLConditionParentStatement: AnyObject {
  24. }
  25. internal protocol XCTLLateExecuteStatement: AnyObject {
  26. func doRealEvaluate(inContext context: XCTLRuntimeAbstractContext,
  27. withArgs args: [XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable
  28. }
  29. internal protocol XCTLBackableStatement: AnyObject {
  30. func evaluateBack(_ valueToBack: XCTLRuntimeVariable, inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable
  31. }
  32. internal class XCTLReferencedVariableStatement {
  33. internal var objectReferenced: XCTLRuntimeVariable
  34. internal var statement: XCTLStatement
  35. internal init(objectReferenced: XCTLRuntimeVariable, statement: XCTLStatement) {
  36. self.objectReferenced = objectReferenced
  37. self.statement = statement
  38. }
  39. }
  40. internal protocol XCTLVariableRequiredLazyStatement {
  41. func evaluate(inContext context: XCTLRuntimeAbstractContext,
  42. withVariableReferenced variable: XCTLRuntimeVariable) throws -> XCTLRuntimeVariable
  43. }
  44. internal class XCTLConditionParentStatementFrame {
  45. var doElse: Bool
  46. var doNext: Bool
  47. internal init() {
  48. self.doElse = true
  49. self.doNext = false
  50. }
  51. internal init(doElse: Bool, doNext: Bool) {
  52. self.doElse = doElse
  53. self.doNext = doNext
  54. }
  55. }
  56. internal class XCTLListStatementFrame {
  57. var breakListEvaluate: Bool
  58. var breakToParagraph: Bool
  59. var listResultValue: XCTLRuntimeVariable
  60. internal init() {
  61. self.breakListEvaluate = false
  62. self.breakToParagraph = true
  63. self.listResultValue = .void
  64. }
  65. internal init(breakListEvaluate: Bool, breakToParagraph: Bool, listResultValue: XCTLRuntimeVariable) {
  66. self.breakListEvaluate = breakListEvaluate
  67. self.breakToParagraph = breakToParagraph
  68. self.listResultValue = listResultValue
  69. }
  70. }
  71. internal class XCTLForStatementFrame {
  72. var breakForEvaluate: Bool
  73. internal init() {
  74. self.breakForEvaluate = false
  75. }
  76. internal init(breakForEvaluate: Bool) {
  77. self.breakForEvaluate = breakForEvaluate
  78. }
  79. }
  80. internal var XCTLStatementPrototypes: [XCTLStatement] = [
  81. XCTLImportStatement(),
  82. XCTLExportStatement(),
  83. XCTLInitStatement(),
  84. XCTLFunctionCallStatement(),
  85. XCTLLazyEqualStatement(),
  86. XCTLImmediateStatement(),
  87. XCTLVariableRefStatement(),
  88. XCTLSwitchStatement(),
  89. XCTLLessthanStatement(),
  90. XCTLMorethanStatement(),
  91. XCTLEqualthanStatement(),
  92. XCTLNextthanStatement(),
  93. XCTLElseStatement(),
  94. XCTLParagraphStatement(),
  95. XCTLSetStatement(),
  96. XCTLReturnStatement(),
  97. XCTLForStatement(),
  98. XCTLBreakStatement(),
  99. XCTLContinueStatement()
  100. ]
  101. internal var XCTLExpressionPrototypes: [XCTLStatement] = [
  102. XCTLFunctionCallStatement(),
  103. XCTLImmediateStatement(),
  104. XCTLInitStatement(),
  105. XCTLVariableRefStatement()
  106. ]
  107. internal var XCTLShortExpressionPrototypes: [XCTLStatement] = [
  108. XCTLFunctionCallStatement(),
  109. XCTLImmediateStatement(),
  110. XCTLVariableRefStatement()
  111. ]
  112. internal func XCTLStatementParseNextStatement(forLexer lex: XCTLLexer,
  113. fromParent parent: XCTLStatement?,
  114. prototypes: [XCTLStatement] = XCTLStatementPrototypes) throws -> XCTLStatement {
  115. for it in prototypes {
  116. let pos = lex.position
  117. let debug = lex.debugMode
  118. lex.debugMode = false
  119. let matchStatement = try it.matchSelfStatement(lex: lex)
  120. lex.position = pos
  121. lex.debugMode = debug
  122. if let newIt = matchStatement {
  123. if lex.debugMode {
  124. print("[AST] Bgn \(newIt.type)")
  125. }
  126. try newIt.parseStatement(fromLexerToSelf: lex, fromParent: parent)
  127. if lex.debugMode {
  128. print("[AST] End \(newIt.type)")
  129. }
  130. return newIt
  131. }
  132. }
  133. throw XCTLCompileTimeError.unknownStatementPrefix(string: try lex.next().rawValue)
  134. }
  135. internal extension XCTLStatement {
  136. func parseNextStatement(forLexer lex: XCTLLexer, prototypes: [XCTLStatement] = XCTLStatementPrototypes) throws -> XCTLStatement {
  137. return try XCTLStatementParseNextStatement(forLexer: lex, fromParent: self, prototypes: prototypes)
  138. }
  139. func parseNextExpression(forLexer lex: XCTLLexer,
  140. terminator: XCTLTokenType = .typeEOF,
  141. prototypes: [XCTLStatement] = XCTLExpressionPrototypes)
  142. throws -> XCTLStatement & XCTLExpression {
  143. let prefixExpr = XCTLPrefixExpression()
  144. prefixExpr.prototypes = prototypes
  145. try prefixExpr.parseStatement(fromLexerToSelf: lex, fromParent: self, terminatorType: terminator)
  146. return prefixExpr
  147. }
  148. }