Browse Source

Fix return and nextthan bug, now return in paragraph will break to paragraph

xcbosa mbp16 2 years ago
parent
commit
f0d46373ec

+ 0 - 64
XCTreeLang.xcodeproj/xcuserdata/xcbosa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -4,38 +4,6 @@
    type = "1"
    version = "2.0">
    <Breakpoints>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "81C29057-447E-42BA-ACE5-94D46BE449CA"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "37"
-            endingLineNumber = "37"
-            landmarkName = "evaluate(inContext:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "ADCCEE0F-7CC6-4F7F-8F05-7FD7364EAEF6"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "40"
-            endingLineNumber = "40"
-            landmarkName = "evaluate(inContext:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
@@ -68,38 +36,6 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "F5980FF4-A83F-452C-905F-0FD18B485911"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "47"
-            endingLineNumber = "47"
-            landmarkName = "evaluate(inContext:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "034A1FDB-D45F-4C4B-AA1C-EA500BA70C63"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "51"
-            endingLineNumber = "51"
-            landmarkName = "evaluate(inContext:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent

+ 2 - 0
XCTreeLang/Runtime/XCTLRuntimeAbstractContext.swift

@@ -30,4 +30,6 @@ internal protocol XCTLRuntimeAbstractContext: AnyObject {
     func recordConditionFrame(_ frame: XCTLConditionParentStatementFrame?)
     func recordListFrame(_ frame: XCTLListStatementFrame?)
     
+    func getParentContext() -> XCTLRuntimeAbstractContext?
+    
 }

+ 4 - 0
XCTreeLang/Runtime/XCTLRuntimeContext.swift

@@ -211,4 +211,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
         self.conditionFrame = frame
     }
     
+    func getParentContext() -> XCTLRuntimeAbstractContext? {
+        return nil
+    }
+    
 }

+ 4 - 0
XCTreeLang/Runtime/XCTLRuntimeSubContext.swift

@@ -117,4 +117,8 @@ internal class XCTLRuntimeSubContext: XCTLRuntimeAbstractContext {
         self.conditionFrame = frame
     }
     
+    func getParentContext() -> XCTLRuntimeAbstractContext? {
+        return self.parent
+    }
+    
 }

+ 13 - 1
XCTreeLang/Statements/VirtualStatement/XCTLListStatement.swift

@@ -19,6 +19,8 @@ internal class XCTLListStatement: XCTLStatement, XCTLListStatementProtocol {
     
     internal weak var parent: XCTLStatement?
     
+    var paragraphHold: Bool = false
+    
     var conditionParent: XCTLConditionParentStatement? {
         var stmt: XCTLStatement? = self.parent
         while true {
@@ -49,9 +51,9 @@ internal class XCTLListStatement: XCTLStatement, XCTLListStatementProtocol {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        let context = context.makeSubContext()
         let frame = XCTLListStatementFrame()
         context.recordListFrame(frame)
-        let context = context.makeSubContext()
         var lastValue = XCTLRuntimeVariable.void
         for it in statements {
             let newValue = try it.evaluate(inContext: context)
@@ -59,6 +61,16 @@ internal class XCTLListStatement: XCTLStatement, XCTLListStatementProtocol {
                 lastValue = newValue
             }
             if frame.breakListEvaluate {
+                if frame.breakToParagraph {
+                    if !self.paragraphHold {
+                        guard let contextParent = context.getParentContext(),
+                              let lastListFrame = contextParent.findListFrame() else {
+                            throw XCTLRuntimeError.invalidListFrame
+                        }
+                        lastListFrame.breakListEvaluate = true
+                        lastListFrame.listResultValue = frame.listResultValue
+                    }
+                }
                 break
             }
         }

+ 1 - 0
XCTreeLang/Statements/XCTLNextthanStatement.swift

@@ -40,6 +40,7 @@ internal class XCTLNextthanStatement: XCTLStatement {
             throw XCTLRuntimeError.invalidConditionFrame
         }
         listFrame.breakListEvaluate = true
+        listFrame.breakToParagraph = false
         condFrame.doNext = true
         return .void
     }

+ 1 - 0
XCTreeLang/Statements/XCTLParagraphStatement.swift

@@ -46,6 +46,7 @@ internal class XCTLParagraphStatement: XCTLStatement, XCTLLateExecuteStatement {
             try lex.next()
         }
         self.runStatements.parent = self
+        self.runStatements.paragraphHold = true
         try self.runStatements.parseStatement(fromLexerToSelf: lex, fromParent: self)
         if lex.paragraphTable[self.paragraphName] != nil {
             throw XCTLCompileTimeError.tooMuchParagraphDefinitionForName(name: self.paragraphName)

+ 6 - 1
XCTreeLang/Statements/XCTLStatement.swift

@@ -35,6 +35,8 @@ internal protocol XCTLListStatementProtocol: AnyObject {
 //
     var conditionParent: XCTLConditionParentStatement? { get }
     
+    var paragraphHold: Bool { get set }
+    
 }
 
 internal protocol XCTLConditionParentStatement: AnyObject {
@@ -75,15 +77,18 @@ internal class XCTLConditionParentStatementFrame {
 
 internal class XCTLListStatementFrame {
     var breakListEvaluate: Bool
+    var breakToParagraph: Bool
     var listResultValue: XCTLRuntimeVariable
     
     internal init() {
         self.breakListEvaluate = false
+        self.breakToParagraph = true
         self.listResultValue = .void
     }
     
-    internal init(breakListEvaluate: Bool, listResultValue: XCTLRuntimeVariable) {
+    internal init(breakListEvaluate: Bool, breakToParagraph: Bool, listResultValue: XCTLRuntimeVariable) {
         self.breakListEvaluate = breakListEvaluate
+        self.breakToParagraph = breakToParagraph
         self.listResultValue = listResultValue
     }
 }