Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  grammar.y  Sprache: unbekannt

 
Spracherkennung für: .y vermutete Sprache: PHP {PHP[45] ABAP[36] Cobol[36]} [Methode: maximale Elemente, drei Dimensionen]

/*****************************************************************************
 * json/grammar.y: JSON parser
 *****************************************************************************
 * Copyright © 2020 Rémi Denis-Courmont
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/


%define api.pure full
%define api.prefix {json}

%lex-param { void *scanner }
%parse-param { void *opaque }
%parse-param { void *scanner }
%parse-param { struct json_object *result }

%{

#include <stdlib.h>
#include <stdio.h>
#include "json.h"

static void json_array_free(struct json_array *);

static void json_value_free(struct json_value *v)
{
 switch (v->type) {
  case JSON_NULL:
  case JSON_BOOLEAN:
  case JSON_NUMBER:
   break;

  case JSON_STRING:
   free(v->string);
   break;

  case JSON_ARRAY:
   json_array_free(&v->array);
   break;

  case JSON_OBJECT:
   json_free(&v->object);
   break;
 }
}

static void json_array_free(struct json_array *a)
{
 for (size_t i = 0; i < a->size; i++)
  json_value_free(&a->entries[i]);

 free(a->entries);
}

static void json_member_free(struct json_member *m)
{
 free(m->name);
 json_value_free(&m->value);
}

void json_free(struct json_object *o)
{
 for (size_t i = 0; i < o->count; i++)
  json_member_free(&o->members[i]);

 free(o->members);
}

static void json_array_init(struct json_array *a)
{
 a->size = 0;
 a->entries = NULL;
}

static void json_array_append(struct json_array *a, struct json_value v)
{
 size_t size = a->size;
 struct json_value *ne = realloc(a->entries, (size + 1) * sizeof (v));

 if (ne != NULL) {
  ne[size] = v;
  a->entries = ne;
  a->size = size + 1;
 } else
  json_value_free(&v);

}

static void json_init(struct json_object *o)
{
 o->count = 0;
 o->members = NULL;
}

static void json_append(struct json_object *o, struct json_member m)
{
 size_t count = o->count;
 struct json_member *nm = realloc(o->members, (count + 1) * sizeof (m));

 if (nm != NULL) {
  nm[count] = m;
  o->members = nm;
  o->count = count + 1;
 } else
  json_member_free(&m);
}

%}

%union {
 bool boolean;
 double number;
 char *string;
 struct json_value value;
 struct json_array array;
 struct json_member member;
 struct json_object object;
}

%token YYEOF 0
%token VALUE_NULL
%token <boolean> BOOLEAN
%token <number> NUMBER
%token <string> STRING

%type <value> value
%type <array> values
%type <array> array
%type <member> member
%type <object> members
%type <object> object

%{

static void yyerror(void *opaque, void *scanner, struct json_object *result,
                    const char *msg)
{
 json_parse_error(opaque, msg);
 (void) scanner; (void) result;
}

extern int jsonlex_init_extra(const void *, void **);
extern int yylex(YYSTYPE *value, void *scanner);
extern int jsonlex_destroy(void *);

%}

%destructor { free($$); } <string>
%destructor { json_value_free(&$$); } <value>
%destructor { json_array_free(&$$); } <array>
%destructor { json_member_free(&$$); } <member>
%destructor { json_free(&$$); } <object>

%%

parse:
 object YYEOF { *result = $1; }
;

object:
 '{' '}'   { json_init(&$$); }
| '{' members '}'  { $$ = $2; }
;

array:
 '[' ']'   { json_array_init(&$$); }
| '[' values ']'  { $$ = $2; }
;

members:
 member   { json_init(&$$); json_append(&$$, $1); }
| members ',' member { $$ = $1; json_append(&$$, $3); }
;

member:
 STRING ':' value { $$.name = $1; $$.value = $3; }
;

values:
 value   { json_array_init(&$$);
     json_array_append(&$$, $1); }
| values ',' value { $$ = $1;
     json_array_append(&$$, $3); }
;

value:
 VALUE_NULL  { $$.type = JSON_NULL; }
| BOOLEAN   { $$.type = JSON_BOOLEAN;
     $$.boolean = $1; }
| NUMBER   { $$.type = JSON_NUMBER;
     $$.number = $1; }
| STRING   { $$.type = JSON_STRING;
     $$.string = $1; }
| array   { $$.type = JSON_ARRAY;
     $$.array = $1; }
| object   { $$.type = JSON_OBJECT;
     $$.object = $1; }
;

%%

int json_parse(void *opaque, struct json_object *result)
{
 void *scanner;
 int ret = jsonlex_init_extra(opaque, &scanner);

 if (ret)
  return ret;

 ret = yyparse(opaque, scanner, result);
 jsonlex_destroy(scanner);
 return ret;
}

[Dauer der Verarbeitung: 0.2 Sekunden, vorverarbeitet 2026-10-24]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1104857
#Domains=418102