gnoga_2.1.2_5f127c56/deps/simple_components/parsers-json-generic_parser.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
 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
--                                                                    --
--  package                         Copyright (c)  Dmitry A. Kazakov  --
--     Parsers.JSON.Generic_Parser                 Luebeck            --
--  Interface                                      Autumn, 2019       --
--                                                                    --
--                                Last revision :  10:13 29 Nov 2020  --
--                                                                    --
--  This  library  is  free software; you can redistribute it and/or  --
--  modify it under the terms of the GNU General Public  License  as  --
--  published by the Free Software Foundation; either version  2  of  --
--  the License, or (at your option) any later version. This library  --
--  is distributed in the hope that it will be useful,  but  WITHOUT  --
--  ANY   WARRANTY;   without   even   the   implied   warranty   of  --
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  --
--  General  Public  License  for  more  details.  You  should  have  --
--  received  a  copy  of  the GNU General Public License along with  --
--  this library; if not, write to  the  Free  Software  Foundation,  --
--  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.    --
--                                                                    --
--  As a special exception, if other files instantiate generics from  --
--  this unit, or you link this unit with other files to produce  an  --
--  executable, this unit does not by  itself  cause  the  resulting  --
--  executable to be covered by the GNU General Public License. This  --
--  exception  does not however invalidate any other reasons why the  --
--  executable file might be covered by the GNU Public License.       --
--____________________________________________________________________--
--
--  This  generic package  is an JSON parser. It can be instantiated for
--  any  type  of  sources,  but  usually  it makes sense for multi-line
--  sources only. The JSON format is governed by RFC 7159.
--
with System.Storage_Pools;  use System.Storage_Pools;

with Parsers.Generic_Source;
with Parsers.Generic_Token.Segmented_Lexer;

generic
   with package Sources is new Parsers.Generic_Source (<>);
package Parsers.JSON.Generic_Parser is
--
-- Parse -- A JSON value
--
--    Code  - To be parsed
--    Arena - The arena storage pool to allocate JSON data
--
-- Returns :
--
--    The JSON value with parts allocated in Arena
--
-- Exceptions :
--
--    Storage_Error - No room in Arena to allocate parts of the value
--    Syntax_Error  - Any syntax error
--
   function Parse
            (  Code  : access Sources.Source_Type;
               Arena : access Root_Storage_Pool'Class
            )  return JSON_Value;
private
   type Argument_Item is record
      Nothing : Boolean;
      Data    : JSON_Argument;
   end record;

   package Tokens is
      new Parsers.Generic_Token
          (  Operation_Type => Operations,
             Argument_Type  => Argument_Item,
             Priority_Type  => Priorities,
             Sources        => Sources
          );
   use Tokens;
--
-- The tables of prefix, infix and postfix operations
--
   Prefixes  : aliased Tokens.Vocabulary.Table;
   Infixes   : aliased Tokens.Vocabulary.Table;
   Postfixes : aliased Tokens.Vocabulary.Table;
--
-- Lexers -- Table driven lexers
--
   package Lexers is new Tokens.Segmented_Lexer;
--
-- Expression -- The lexer using our tables
--
   type Expression
        (  Arena : access Root_Storage_Pool'Class
        )  is new Lexers.Lexer
                  (  Prefixes  => Prefixes'Access,
                     Infixes   => Infixes'Access,
                     Postfixes => Postfixes'Access
                  )  with null record;
   function Call
            (  Context   : access Expression;
               Operation : Tokens.Operation_Token;
               List      : Tokens.Arguments.Frame
            )  return  Tokens.Argument_Token;
   function Enclose
            (  Context : access Expression;
               Left    : Tokens.Operation_Token;
               Right   : Tokens.Operation_Token;
               List    : Tokens.Arguments.Frame
            )  return Tokens.Argument_Token;
   procedure Get_Blank
             (  Context : in out Expression;
                Code    : in out Lexers.Lexer_Source_Type;
                Got_It  : out Boolean
             );
   procedure Get_Operand
             (  Context  : in out Expression;
                Code     : in out Lexers.Lexer_Source_Type;
                Argument : out Tokens.Argument_Token;
                Got_It   : out Boolean
             );overriding
   procedure On_Missing_Operand
             (  Context   : in out Expression;
                Code      : in out Lexers.Lexer_Source_Type;
                Operation : Tokens.Operation_Token;
                Argument  : out Tokens.Argument_Token
             );

end Parsers.JSON.Generic_Parser;