summaryrefslogtreecommitdiff
path: root/test/packrat-lexer-debug.adb
blob: f13a675cf78e6a6e34cd42f3e2e3f26a54f7800d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123


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;





    function So_Far
           (This : in Lexer_Context)
        return Token_Vector is
    begin
        return (This.Result_So_Far with null record);
    end So_Far;

    function Position
           (This : in Lexer_Context)
        return Positive is
    begin
        return This.Position;
    end Position;

    function Status
           (This : in Lexer_Context)
        return Result_Status is
    begin
        return This.Status;
    end Status;

    function Pass
           (This : in Lexer_Context)
        return access Element_Array is
    begin
        return This.Pass_Forward;
    end Pass;


end Packrat.Lexer.Debug;