diff options
Diffstat (limited to 'test/packrat-lexer-debug.adb')
-rw-r--r-- | test/packrat-lexer-debug.adb | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/test/packrat-lexer-debug.adb b/test/packrat-lexer-debug.adb new file mode 100644 index 0000000..fdd9ae4 --- /dev/null +++ b/test/packrat-lexer-debug.adb @@ -0,0 +1,91 @@ + + +package body Packrat.Lexer.Debug is + + + function Create_Result + (Length : in Natural; + Status : in Result_Status; + Value : in Element_Array) + return Combinator_Result + is + This : Combinator_Result; + begin + This.Length := Length; + This.Status := Status; + This.Value := new Element_Array (1 .. Value'Length); + This.Value.all := Value; + return This; + end Create_Result; + + + function Join + (Left, Right : in Combinator_Result) + return Combinator_Result + is + Merge : Combinator_Result; + Left_Valsize, Right_Valsize, Total_Valsize : Natural; + begin + if Left.Value /= null then + Left_Valsize := Left.Value.all'Length; + else + Left_Valsize := 0; + end if; + if Right.Value /= null then + Right_Valsize := Right.Value.all'Length; + else + Right_Valsize := 0; + end if; + Total_Valsize := Left_Valsize + Right_Valsize; + + if Left.Status = Success or Left.Status = Optional_More then + Merge.Length := Left.Length + Right.Length; + Merge.Status := Right.Status; + if Total_Valsize > 0 then + Merge.Value := new Element_Array (1 .. Total_Valsize); + if Left.Value /= null then + Merge.Value.all (1 .. Left_Valsize) := Left.Value.all; + end if; + if Right.Value /= null then + Merge.Value.all (Left_Valsize + 1 .. Total_Valsize) := Right.Value.all; + end if; + end if; + return Merge; + elsif Left.Status = Needs_More then + Merge := Left; + Merge.Status := Failure; + return Merge; + else + return Left; + end if; + end Join; + + + function Status + (This : in Combinator_Result) + return Result_Status is + begin + return This.Status; + end Status; + + + function Debug_String + (This : in Combinator_Result) + return String + is + Value_Length : Natural; + begin + if This.Value = null then + Value_Length := 0; + else + Value_Length := This.Value.all'Length; + end if; + return Integer'Image (This.Length) + & " " & Result_Status'Image (This.Status) + & " " & Integer'Image (Value_Length); + end Debug_String; + + +end Packrat.Lexer.Debug; + + |