openglada_0.9.0_4deb7eff/src/generator/tokenization.ads

 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
--  part of OpenGLAda, (c) 2017 Felix Krause
--  released under the terms of the MIT license, see the file "COPYING"

with Ada.Containers.Indefinite_Hashed_Maps;
with Ada.Strings.Hash;

package Tokenization is
   type Tokenizer (<>) is limited private;

   type Symbol_Id is new Positive;

   type Token_Kind is (Identifier, Numeric_Literal, String_Literal,
      Delimiter, Comment, Stream_End);

   type Token (Length : Natural; Kind : Token_Kind) is limited record
      Content : String (1 .. Length);
      Start   : Positive;
      case Kind is
      when Identifier =>
         Id : Symbol_Id;
      when others => null;
      end case;
   end record;

   Tokenization_Error : exception;

   function Tokenize (File_Path : String) return Tokenizer;

   function Next (Object : in out Tokenizer) return Token;

   function Paren_Depth (Object : Tokenizer) return Natural;

   function Line (Object : Tokenizer) return Positive;
   function Column (Object : Tokenizer) return Positive;

   function To_String (T : Token) return String;
   
   function Input_Substring (Object: Tokenizer; From, To : Token) return String;

   function Is_Keyword (Id : Symbol_Id) return Boolean;

   function Copy (T : Token) return Token;

   procedure Register_Symbol (Object : in out Tokenizer; Symbol : String;
                              New_Id : out Symbol_Id);

   Keyword_Access    : constant Symbol_Id := 1;
   Keyword_Constant  : constant Symbol_Id := 2;
   Keyword_Dynamic   : constant Symbol_Id := 3;
   Keyword_End       : constant Symbol_Id := 4;
   Keyword_Function  : constant Symbol_Id := 5;
   Keyword_In        : constant Symbol_Id := 6;
   Keyword_Is        : constant Symbol_Id := 7;
   Keyword_Out       : constant Symbol_Id := 8;
   Keyword_Package   : constant Symbol_Id := 9;
   Keyword_Pragma    : constant Symbol_Id := 10;
   Keyword_Procedure : constant Symbol_Id := 11;
   Keyword_Return    : constant Symbol_Id := 12;
   Keyword_Spec      : constant Symbol_Id := 13;
   Keyword_Static    : constant Symbol_Id := 14;
   Keyword_Subtype   : constant Symbol_Id := 15;
   Keyword_Type      : constant Symbol_Id := 16;
   Keyword_Use       : constant Symbol_Id := 17;
   Keyword_With      : constant Symbol_Id := 18;
   Keyword_Wrapper   : constant Symbol_Id := 19;
private
   function Case_Insensitive_Hash (S : String) return Ada.Containers.Hash_Type;
   function Case_Insensitive_Equals (Left, Right : String) return Boolean;

   package String_Indexer is new Ada.Containers.Indefinite_Hashed_Maps
     (String, Symbol_Id, Case_Insensitive_Hash, Case_Insensitive_Equals);

   type Tokenizer (Length : Positive) is record
      Input : String (1 .. Length);
      Pos : Positive;
      Symbol_Table : String_Indexer.Map;
      Depth : Natural;
      Cur_Line, Cur_Column, Prev_Line, Prev_Column : Positive;
   end record;

end Tokenization;