summaryrefslogtreecommitdiff
path: root/src/packrat-tokens.adb
blob: 60d03e30676b33668d09a4fe2b446ff9f572175d (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


with

    Ada.Characters.Latin_1;


package body Packrat.Tokens is


    package SU renames Ada.Strings.Unbounded;
    package Latin renames Ada.Characters.Latin_1;





    function "<"
           (Left, Right : in Token)
        return Boolean
    is
        Left_Index, Right_Index : Positive;
    begin
        if Left.Start_At = Right.Start_At then
            if Left.Identifier = Right.Identifier then
                Left_Index := Left.Token_Value.Constant_Reference.Element'First;
                Right_Index := Right.Token_Value.Constant_Reference.Element'First;
                while Left_Index <= Left.Token_Value.Constant_Reference.Element'Last and
                    Right_Index <= Right.Token_Value.Constant_Reference.Element'Last
                loop
                    if Left.Token_Value.Constant_Reference.Element (Left_Index) <
                        Right.Token_Value.Constant_Reference.Element (Right_Index)
                    then
                        return True;
                    elsif Left.Token_Value.Constant_Reference.Element (Left_Index) /=
                        Right.Token_Value.Constant_Reference.Element (Right_Index)
                    then
                        return False;
                    end if;
                    Left_Index := Left_Index + 1;
                    Right_Index := Right_Index + 1;
                end loop;
                return Left.Token_Value.Constant_Reference.Element'Length <
                    Right.Token_Value.Constant_Reference.Element'Length;
            else
                return Left.Identifier < Right.Identifier;
            end if;
        else
            return Left.Start_At < Right.Start_At;
        end if;
    end "<";





    function Create
           (Ident  : in Label_Enum;
            Start  : in Positive;
            Value  : in Element_Array)
        return Token is
    begin
        return This : Token do
            This.Identifier := Ident;
            This.Start_At := Start;
            This.Token_Value := Value_Holders.To_Holder (Value);
        end return;
    end Create;





    function Debug_String
           (This : in Token)
        return String
    is
        Result : SU.Unbounded_String := +"";
    begin
        SU.Append (Result, "Token " & Label_Enum'Image (This.Identifier) &
            " at input position" & Integer'Image (This.Start_At) & " with value length" &
            Integer'Image (This.Token_Value.Constant_Reference.Element'Length) & Latin.LF);
        return -Result;
    end Debug_String;





    function Label
           (This : in Token)
        return Label_Enum is
    begin
        return This.Identifier;
    end Label;


    function Start
           (This : in Token)
        return Positive is
    begin
        return This.Start_At;
    end Start;


    function Value
           (This : in Token)
        return Element_Array is
    begin
        return This.Token_Value.Element;
    end Value;


end Packrat.Tokens;