xref: /aosp_15_r20/external/libconfig/lib/grammar.y (revision 2e9d491483b805f09ea864149eadd5680efcc72a)
1*2e9d4914SAndroid Build Coastguard Worker /* -*- mode: C -*- */
2*2e9d4914SAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
3*2e9d4914SAndroid Build Coastguard Worker    libconfig - A library for processing structured configuration files
4*2e9d4914SAndroid Build Coastguard Worker    Copyright (C) 2005-2018  Mark A Lindner
5*2e9d4914SAndroid Build Coastguard Worker 
6*2e9d4914SAndroid Build Coastguard Worker    This file is part of libconfig.
7*2e9d4914SAndroid Build Coastguard Worker 
8*2e9d4914SAndroid Build Coastguard Worker    This library is free software; you can redistribute it and/or
9*2e9d4914SAndroid Build Coastguard Worker    modify it under the terms of the GNU Lesser General Public License
10*2e9d4914SAndroid Build Coastguard Worker    as published by the Free Software Foundation; either version 2.1 of
11*2e9d4914SAndroid Build Coastguard Worker    the License, or (at your option) any later version.
12*2e9d4914SAndroid Build Coastguard Worker 
13*2e9d4914SAndroid Build Coastguard Worker    This library is distributed in the hope that it will be useful, but
14*2e9d4914SAndroid Build Coastguard Worker    WITHOUT ANY WARRANTY; without even the implied warranty of
15*2e9d4914SAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16*2e9d4914SAndroid Build Coastguard Worker    Lesser General Public License for more details.
17*2e9d4914SAndroid Build Coastguard Worker 
18*2e9d4914SAndroid Build Coastguard Worker    You should have received a copy of the GNU Library General Public
19*2e9d4914SAndroid Build Coastguard Worker    License along with this library; if not, see
20*2e9d4914SAndroid Build Coastguard Worker    <http://www.gnu.org/licenses/>.
21*2e9d4914SAndroid Build Coastguard Worker    ----------------------------------------------------------------------------
22*2e9d4914SAndroid Build Coastguard Worker */
23*2e9d4914SAndroid Build Coastguard Worker 
24*2e9d4914SAndroid Build Coastguard Worker %defines
25*2e9d4914SAndroid Build Coastguard Worker %output "y.tab.c"
26*2e9d4914SAndroid Build Coastguard Worker %pure-parser
27*2e9d4914SAndroid Build Coastguard Worker %lex-param{void *scanner}
28*2e9d4914SAndroid Build Coastguard Worker %parse-param{void *scanner}
29*2e9d4914SAndroid Build Coastguard Worker %parse-param{struct parse_context *ctx}
30*2e9d4914SAndroid Build Coastguard Worker %parse-param{struct scan_context *scan_ctx}
31*2e9d4914SAndroid Build Coastguard Worker 
32*2e9d4914SAndroid Build Coastguard Worker %{
33*2e9d4914SAndroid Build Coastguard Worker #include <string.h>
34*2e9d4914SAndroid Build Coastguard Worker #include <stdlib.h>
35*2e9d4914SAndroid Build Coastguard Worker 
36*2e9d4914SAndroid Build Coastguard Worker #include "libconfig.h"
37*2e9d4914SAndroid Build Coastguard Worker #include "parsectx.h"
38*2e9d4914SAndroid Build Coastguard Worker #include "scanctx.h"
39*2e9d4914SAndroid Build Coastguard Worker #include "util.h"
40*2e9d4914SAndroid Build Coastguard Worker #include "wincompat.h"
41*2e9d4914SAndroid Build Coastguard Worker 
42*2e9d4914SAndroid Build Coastguard Worker /* These declarations are provided to suppress compiler warnings. */
43*2e9d4914SAndroid Build Coastguard Worker extern int libconfig_yylex();
44*2e9d4914SAndroid Build Coastguard Worker extern int libconfig_yyget_lineno();
45*2e9d4914SAndroid Build Coastguard Worker 
46*2e9d4914SAndroid Build Coastguard Worker static const char *err_array_elem_type = "mismatched element type in array";
47*2e9d4914SAndroid Build Coastguard Worker static const char *err_duplicate_setting = "duplicate setting name";
48*2e9d4914SAndroid Build Coastguard Worker 
49*2e9d4914SAndroid Build Coastguard Worker #define IN_ARRAY() \
50*2e9d4914SAndroid Build Coastguard Worker   (ctx->parent && (ctx->parent->type == CONFIG_TYPE_ARRAY))
51*2e9d4914SAndroid Build Coastguard Worker 
52*2e9d4914SAndroid Build Coastguard Worker #define IN_LIST() \
53*2e9d4914SAndroid Build Coastguard Worker   (ctx->parent && (ctx->parent->type == CONFIG_TYPE_LIST))
54*2e9d4914SAndroid Build Coastguard Worker 
55*2e9d4914SAndroid Build Coastguard Worker static void capture_parse_pos(void *scanner, struct scan_context *scan_ctx,
56*2e9d4914SAndroid Build Coastguard Worker                               config_setting_t *setting)
57*2e9d4914SAndroid Build Coastguard Worker {
58*2e9d4914SAndroid Build Coastguard Worker   setting->line = (unsigned int)libconfig_yyget_lineno(scanner);
59*2e9d4914SAndroid Build Coastguard Worker   setting->file = libconfig_scanctx_current_filename(scan_ctx);
60*2e9d4914SAndroid Build Coastguard Worker }
61*2e9d4914SAndroid Build Coastguard Worker 
62*2e9d4914SAndroid Build Coastguard Worker #define CAPTURE_PARSE_POS(S) \
63*2e9d4914SAndroid Build Coastguard Worker   capture_parse_pos(scanner, scan_ctx, (S))
64*2e9d4914SAndroid Build Coastguard Worker 
65*2e9d4914SAndroid Build Coastguard Worker void libconfig_yyerror(void *scanner, struct parse_context *ctx,
66*2e9d4914SAndroid Build Coastguard Worker                        struct scan_context *scan_ctx, char const *s)
67*2e9d4914SAndroid Build Coastguard Worker {
68*2e9d4914SAndroid Build Coastguard Worker   if(ctx->config->error_text) return;
69*2e9d4914SAndroid Build Coastguard Worker   ctx->config->error_line = libconfig_yyget_lineno(scanner);
70*2e9d4914SAndroid Build Coastguard Worker   ctx->config->error_text = s;
71*2e9d4914SAndroid Build Coastguard Worker }
72*2e9d4914SAndroid Build Coastguard Worker 
73*2e9d4914SAndroid Build Coastguard Worker %}
74*2e9d4914SAndroid Build Coastguard Worker 
75*2e9d4914SAndroid Build Coastguard Worker %union
76*2e9d4914SAndroid Build Coastguard Worker {
77*2e9d4914SAndroid Build Coastguard Worker   int ival;
78*2e9d4914SAndroid Build Coastguard Worker   long long llval;
79*2e9d4914SAndroid Build Coastguard Worker   double fval;
80*2e9d4914SAndroid Build Coastguard Worker   char *sval;
81*2e9d4914SAndroid Build Coastguard Worker }
82*2e9d4914SAndroid Build Coastguard Worker 
83*2e9d4914SAndroid Build Coastguard Worker %token <ival> TOK_BOOLEAN TOK_INTEGER TOK_HEX
84*2e9d4914SAndroid Build Coastguard Worker %token <llval> TOK_INTEGER64 TOK_HEX64
85*2e9d4914SAndroid Build Coastguard Worker %token <fval> TOK_FLOAT
86*2e9d4914SAndroid Build Coastguard Worker %token <sval> TOK_STRING TOK_NAME
87*2e9d4914SAndroid Build Coastguard Worker %token TOK_EQUALS TOK_NEWLINE TOK_ARRAY_START TOK_ARRAY_END TOK_LIST_START TOK_LIST_END TOK_COMMA TOK_GROUP_START TOK_GROUP_END TOK_SEMICOLON TOK_GARBAGE TOK_ERROR
88*2e9d4914SAndroid Build Coastguard Worker %destructor { free($$); } TOK_STRING
89*2e9d4914SAndroid Build Coastguard Worker 
90*2e9d4914SAndroid Build Coastguard Worker %%
91*2e9d4914SAndroid Build Coastguard Worker 
92*2e9d4914SAndroid Build Coastguard Worker configuration:
93*2e9d4914SAndroid Build Coastguard Worker     /* empty */
94*2e9d4914SAndroid Build Coastguard Worker   | setting_list
95*2e9d4914SAndroid Build Coastguard Worker   ;
96*2e9d4914SAndroid Build Coastguard Worker 
97*2e9d4914SAndroid Build Coastguard Worker setting_list:
98*2e9d4914SAndroid Build Coastguard Worker     setting
99*2e9d4914SAndroid Build Coastguard Worker   | setting_list setting
100*2e9d4914SAndroid Build Coastguard Worker   ;
101*2e9d4914SAndroid Build Coastguard Worker 
102*2e9d4914SAndroid Build Coastguard Worker setting_list_optional:
103*2e9d4914SAndroid Build Coastguard Worker     /* empty */
104*2e9d4914SAndroid Build Coastguard Worker   | setting_list
105*2e9d4914SAndroid Build Coastguard Worker   ;
106*2e9d4914SAndroid Build Coastguard Worker 
107*2e9d4914SAndroid Build Coastguard Worker setting_terminator:
108*2e9d4914SAndroid Build Coastguard Worker     /* empty */
109*2e9d4914SAndroid Build Coastguard Worker   | TOK_SEMICOLON
110*2e9d4914SAndroid Build Coastguard Worker   | TOK_COMMA
111*2e9d4914SAndroid Build Coastguard Worker   ;
112*2e9d4914SAndroid Build Coastguard Worker 
113*2e9d4914SAndroid Build Coastguard Worker setting:
114*2e9d4914SAndroid Build Coastguard Worker   TOK_NAME
115*2e9d4914SAndroid Build Coastguard Worker   {
116*2e9d4914SAndroid Build Coastguard Worker     ctx->setting = config_setting_add(ctx->parent, $1, CONFIG_TYPE_NONE);
117*2e9d4914SAndroid Build Coastguard Worker 
118*2e9d4914SAndroid Build Coastguard Worker     if(ctx->setting == NULL)
119*2e9d4914SAndroid Build Coastguard Worker     {
120*2e9d4914SAndroid Build Coastguard Worker       libconfig_yyerror(scanner, ctx, scan_ctx, err_duplicate_setting);
121*2e9d4914SAndroid Build Coastguard Worker       YYABORT;
122*2e9d4914SAndroid Build Coastguard Worker     }
123*2e9d4914SAndroid Build Coastguard Worker     else
124*2e9d4914SAndroid Build Coastguard Worker     {
125*2e9d4914SAndroid Build Coastguard Worker       CAPTURE_PARSE_POS(ctx->setting);
126*2e9d4914SAndroid Build Coastguard Worker     }
127*2e9d4914SAndroid Build Coastguard Worker   }
128*2e9d4914SAndroid Build Coastguard Worker 
129*2e9d4914SAndroid Build Coastguard Worker   TOK_EQUALS value setting_terminator
130*2e9d4914SAndroid Build Coastguard Worker   ;
131*2e9d4914SAndroid Build Coastguard Worker 
132*2e9d4914SAndroid Build Coastguard Worker array:
133*2e9d4914SAndroid Build Coastguard Worker   TOK_ARRAY_START
134*2e9d4914SAndroid Build Coastguard Worker   {
135*2e9d4914SAndroid Build Coastguard Worker     if(IN_LIST())
136*2e9d4914SAndroid Build Coastguard Worker     {
137*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = config_setting_add(ctx->parent, NULL, CONFIG_TYPE_ARRAY);
138*2e9d4914SAndroid Build Coastguard Worker       CAPTURE_PARSE_POS(ctx->parent);
139*2e9d4914SAndroid Build Coastguard Worker     }
140*2e9d4914SAndroid Build Coastguard Worker     else
141*2e9d4914SAndroid Build Coastguard Worker     {
142*2e9d4914SAndroid Build Coastguard Worker       ctx->setting->type = CONFIG_TYPE_ARRAY;
143*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = ctx->setting;
144*2e9d4914SAndroid Build Coastguard Worker       ctx->setting = NULL;
145*2e9d4914SAndroid Build Coastguard Worker     }
146*2e9d4914SAndroid Build Coastguard Worker   }
147*2e9d4914SAndroid Build Coastguard Worker   simple_value_list_optional
148*2e9d4914SAndroid Build Coastguard Worker   TOK_ARRAY_END
149*2e9d4914SAndroid Build Coastguard Worker   {
150*2e9d4914SAndroid Build Coastguard Worker     if(ctx->parent)
151*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = ctx->parent->parent;
152*2e9d4914SAndroid Build Coastguard Worker   }
153*2e9d4914SAndroid Build Coastguard Worker   ;
154*2e9d4914SAndroid Build Coastguard Worker 
155*2e9d4914SAndroid Build Coastguard Worker list:
156*2e9d4914SAndroid Build Coastguard Worker   TOK_LIST_START
157*2e9d4914SAndroid Build Coastguard Worker   {
158*2e9d4914SAndroid Build Coastguard Worker     if(IN_LIST())
159*2e9d4914SAndroid Build Coastguard Worker     {
160*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = config_setting_add(ctx->parent, NULL, CONFIG_TYPE_LIST);
161*2e9d4914SAndroid Build Coastguard Worker       CAPTURE_PARSE_POS(ctx->parent);
162*2e9d4914SAndroid Build Coastguard Worker     }
163*2e9d4914SAndroid Build Coastguard Worker     else
164*2e9d4914SAndroid Build Coastguard Worker     {
165*2e9d4914SAndroid Build Coastguard Worker       ctx->setting->type = CONFIG_TYPE_LIST;
166*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = ctx->setting;
167*2e9d4914SAndroid Build Coastguard Worker       ctx->setting = NULL;
168*2e9d4914SAndroid Build Coastguard Worker     }
169*2e9d4914SAndroid Build Coastguard Worker   }
170*2e9d4914SAndroid Build Coastguard Worker   value_list_optional
171*2e9d4914SAndroid Build Coastguard Worker   TOK_LIST_END
172*2e9d4914SAndroid Build Coastguard Worker   {
173*2e9d4914SAndroid Build Coastguard Worker     if(ctx->parent)
174*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = ctx->parent->parent;
175*2e9d4914SAndroid Build Coastguard Worker   }
176*2e9d4914SAndroid Build Coastguard Worker   ;
177*2e9d4914SAndroid Build Coastguard Worker 
178*2e9d4914SAndroid Build Coastguard Worker value:
179*2e9d4914SAndroid Build Coastguard Worker     simple_value
180*2e9d4914SAndroid Build Coastguard Worker   | array
181*2e9d4914SAndroid Build Coastguard Worker   | list
182*2e9d4914SAndroid Build Coastguard Worker   | group
183*2e9d4914SAndroid Build Coastguard Worker   ;
184*2e9d4914SAndroid Build Coastguard Worker 
185*2e9d4914SAndroid Build Coastguard Worker string:
186*2e9d4914SAndroid Build Coastguard Worker   TOK_STRING { libconfig_parsectx_append_string(ctx, $1); free($1); }
187*2e9d4914SAndroid Build Coastguard Worker   | string TOK_STRING { libconfig_parsectx_append_string(ctx, $2); free($2); }
188*2e9d4914SAndroid Build Coastguard Worker   ;
189*2e9d4914SAndroid Build Coastguard Worker 
190*2e9d4914SAndroid Build Coastguard Worker simple_value:
191*2e9d4914SAndroid Build Coastguard Worker     TOK_BOOLEAN
192*2e9d4914SAndroid Build Coastguard Worker   {
193*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
194*2e9d4914SAndroid Build Coastguard Worker     {
195*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_bool_elem(ctx->parent, -1,
196*2e9d4914SAndroid Build Coastguard Worker                                                          (int)$1);
197*2e9d4914SAndroid Build Coastguard Worker 
198*2e9d4914SAndroid Build Coastguard Worker       if(! e)
199*2e9d4914SAndroid Build Coastguard Worker       {
200*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
201*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
202*2e9d4914SAndroid Build Coastguard Worker       }
203*2e9d4914SAndroid Build Coastguard Worker       else
204*2e9d4914SAndroid Build Coastguard Worker       {
205*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
206*2e9d4914SAndroid Build Coastguard Worker       }
207*2e9d4914SAndroid Build Coastguard Worker     }
208*2e9d4914SAndroid Build Coastguard Worker     else
209*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_bool(ctx->setting, (int)$1);
210*2e9d4914SAndroid Build Coastguard Worker   }
211*2e9d4914SAndroid Build Coastguard Worker   | TOK_INTEGER
212*2e9d4914SAndroid Build Coastguard Worker   {
213*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
214*2e9d4914SAndroid Build Coastguard Worker     {
215*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, $1);
216*2e9d4914SAndroid Build Coastguard Worker       if(! e)
217*2e9d4914SAndroid Build Coastguard Worker       {
218*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
219*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
220*2e9d4914SAndroid Build Coastguard Worker       }
221*2e9d4914SAndroid Build Coastguard Worker       else
222*2e9d4914SAndroid Build Coastguard Worker       {
223*2e9d4914SAndroid Build Coastguard Worker         config_setting_set_format(e, CONFIG_FORMAT_DEFAULT);
224*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
225*2e9d4914SAndroid Build Coastguard Worker       }
226*2e9d4914SAndroid Build Coastguard Worker     }
227*2e9d4914SAndroid Build Coastguard Worker     else
228*2e9d4914SAndroid Build Coastguard Worker     {
229*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_int(ctx->setting, $1);
230*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_format(ctx->setting, CONFIG_FORMAT_DEFAULT);
231*2e9d4914SAndroid Build Coastguard Worker     }
232*2e9d4914SAndroid Build Coastguard Worker   }
233*2e9d4914SAndroid Build Coastguard Worker   | TOK_INTEGER64
234*2e9d4914SAndroid Build Coastguard Worker   {
235*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
236*2e9d4914SAndroid Build Coastguard Worker     {
237*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, $1);
238*2e9d4914SAndroid Build Coastguard Worker       if(! e)
239*2e9d4914SAndroid Build Coastguard Worker       {
240*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
241*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
242*2e9d4914SAndroid Build Coastguard Worker       }
243*2e9d4914SAndroid Build Coastguard Worker       else
244*2e9d4914SAndroid Build Coastguard Worker       {
245*2e9d4914SAndroid Build Coastguard Worker         config_setting_set_format(e, CONFIG_FORMAT_DEFAULT);
246*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
247*2e9d4914SAndroid Build Coastguard Worker       }
248*2e9d4914SAndroid Build Coastguard Worker     }
249*2e9d4914SAndroid Build Coastguard Worker     else
250*2e9d4914SAndroid Build Coastguard Worker     {
251*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_int64(ctx->setting, $1);
252*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_format(ctx->setting, CONFIG_FORMAT_DEFAULT);
253*2e9d4914SAndroid Build Coastguard Worker     }
254*2e9d4914SAndroid Build Coastguard Worker   }
255*2e9d4914SAndroid Build Coastguard Worker   | TOK_HEX
256*2e9d4914SAndroid Build Coastguard Worker   {
257*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
258*2e9d4914SAndroid Build Coastguard Worker     {
259*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, $1);
260*2e9d4914SAndroid Build Coastguard Worker       if(! e)
261*2e9d4914SAndroid Build Coastguard Worker       {
262*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
263*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
264*2e9d4914SAndroid Build Coastguard Worker       }
265*2e9d4914SAndroid Build Coastguard Worker       else
266*2e9d4914SAndroid Build Coastguard Worker       {
267*2e9d4914SAndroid Build Coastguard Worker         config_setting_set_format(e, CONFIG_FORMAT_HEX);
268*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
269*2e9d4914SAndroid Build Coastguard Worker       }
270*2e9d4914SAndroid Build Coastguard Worker     }
271*2e9d4914SAndroid Build Coastguard Worker     else
272*2e9d4914SAndroid Build Coastguard Worker     {
273*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_int(ctx->setting, $1);
274*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX);
275*2e9d4914SAndroid Build Coastguard Worker     }
276*2e9d4914SAndroid Build Coastguard Worker   }
277*2e9d4914SAndroid Build Coastguard Worker   | TOK_HEX64
278*2e9d4914SAndroid Build Coastguard Worker   {
279*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
280*2e9d4914SAndroid Build Coastguard Worker     {
281*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, $1);
282*2e9d4914SAndroid Build Coastguard Worker       if(! e)
283*2e9d4914SAndroid Build Coastguard Worker       {
284*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
285*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
286*2e9d4914SAndroid Build Coastguard Worker       }
287*2e9d4914SAndroid Build Coastguard Worker       else
288*2e9d4914SAndroid Build Coastguard Worker       {
289*2e9d4914SAndroid Build Coastguard Worker         config_setting_set_format(e, CONFIG_FORMAT_HEX);
290*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
291*2e9d4914SAndroid Build Coastguard Worker       }
292*2e9d4914SAndroid Build Coastguard Worker     }
293*2e9d4914SAndroid Build Coastguard Worker     else
294*2e9d4914SAndroid Build Coastguard Worker     {
295*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_int64(ctx->setting, $1);
296*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX);
297*2e9d4914SAndroid Build Coastguard Worker     }
298*2e9d4914SAndroid Build Coastguard Worker   }
299*2e9d4914SAndroid Build Coastguard Worker   | TOK_FLOAT
300*2e9d4914SAndroid Build Coastguard Worker   {
301*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
302*2e9d4914SAndroid Build Coastguard Worker     {
303*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_float_elem(ctx->parent, -1, $1);
304*2e9d4914SAndroid Build Coastguard Worker       if(! e)
305*2e9d4914SAndroid Build Coastguard Worker       {
306*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
307*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
308*2e9d4914SAndroid Build Coastguard Worker       }
309*2e9d4914SAndroid Build Coastguard Worker       else
310*2e9d4914SAndroid Build Coastguard Worker       {
311*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
312*2e9d4914SAndroid Build Coastguard Worker       }
313*2e9d4914SAndroid Build Coastguard Worker     }
314*2e9d4914SAndroid Build Coastguard Worker     else
315*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_float(ctx->setting, $1);
316*2e9d4914SAndroid Build Coastguard Worker   }
317*2e9d4914SAndroid Build Coastguard Worker   | string
318*2e9d4914SAndroid Build Coastguard Worker   {
319*2e9d4914SAndroid Build Coastguard Worker     if(IN_ARRAY() || IN_LIST())
320*2e9d4914SAndroid Build Coastguard Worker     {
321*2e9d4914SAndroid Build Coastguard Worker       const char *s = libconfig_parsectx_take_string(ctx);
322*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *e = config_setting_set_string_elem(ctx->parent, -1, s);
323*2e9d4914SAndroid Build Coastguard Worker       __delete(s);
324*2e9d4914SAndroid Build Coastguard Worker 
325*2e9d4914SAndroid Build Coastguard Worker       if(! e)
326*2e9d4914SAndroid Build Coastguard Worker       {
327*2e9d4914SAndroid Build Coastguard Worker         libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
328*2e9d4914SAndroid Build Coastguard Worker         YYABORT;
329*2e9d4914SAndroid Build Coastguard Worker       }
330*2e9d4914SAndroid Build Coastguard Worker       else
331*2e9d4914SAndroid Build Coastguard Worker       {
332*2e9d4914SAndroid Build Coastguard Worker         CAPTURE_PARSE_POS(e);
333*2e9d4914SAndroid Build Coastguard Worker       }
334*2e9d4914SAndroid Build Coastguard Worker     }
335*2e9d4914SAndroid Build Coastguard Worker     else
336*2e9d4914SAndroid Build Coastguard Worker     {
337*2e9d4914SAndroid Build Coastguard Worker       const char *s = libconfig_parsectx_take_string(ctx);
338*2e9d4914SAndroid Build Coastguard Worker       config_setting_set_string(ctx->setting, s);
339*2e9d4914SAndroid Build Coastguard Worker       __delete(s);
340*2e9d4914SAndroid Build Coastguard Worker     }
341*2e9d4914SAndroid Build Coastguard Worker   }
342*2e9d4914SAndroid Build Coastguard Worker   ;
343*2e9d4914SAndroid Build Coastguard Worker 
344*2e9d4914SAndroid Build Coastguard Worker value_list:
345*2e9d4914SAndroid Build Coastguard Worker     value
346*2e9d4914SAndroid Build Coastguard Worker   | value_list TOK_COMMA value
347*2e9d4914SAndroid Build Coastguard Worker   | value_list TOK_COMMA
348*2e9d4914SAndroid Build Coastguard Worker   ;
349*2e9d4914SAndroid Build Coastguard Worker 
350*2e9d4914SAndroid Build Coastguard Worker value_list_optional:
351*2e9d4914SAndroid Build Coastguard Worker     /* empty */
352*2e9d4914SAndroid Build Coastguard Worker   | value_list
353*2e9d4914SAndroid Build Coastguard Worker   ;
354*2e9d4914SAndroid Build Coastguard Worker 
355*2e9d4914SAndroid Build Coastguard Worker simple_value_list:
356*2e9d4914SAndroid Build Coastguard Worker     simple_value
357*2e9d4914SAndroid Build Coastguard Worker   | simple_value_list TOK_COMMA simple_value
358*2e9d4914SAndroid Build Coastguard Worker   | simple_value_list TOK_COMMA
359*2e9d4914SAndroid Build Coastguard Worker   ;
360*2e9d4914SAndroid Build Coastguard Worker 
361*2e9d4914SAndroid Build Coastguard Worker simple_value_list_optional:
362*2e9d4914SAndroid Build Coastguard Worker     /* empty */
363*2e9d4914SAndroid Build Coastguard Worker   | simple_value_list
364*2e9d4914SAndroid Build Coastguard Worker   ;
365*2e9d4914SAndroid Build Coastguard Worker 
366*2e9d4914SAndroid Build Coastguard Worker group:
367*2e9d4914SAndroid Build Coastguard Worker   TOK_GROUP_START
368*2e9d4914SAndroid Build Coastguard Worker   {
369*2e9d4914SAndroid Build Coastguard Worker     if(IN_LIST())
370*2e9d4914SAndroid Build Coastguard Worker     {
371*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = config_setting_add(ctx->parent, NULL, CONFIG_TYPE_GROUP);
372*2e9d4914SAndroid Build Coastguard Worker       CAPTURE_PARSE_POS(ctx->parent);
373*2e9d4914SAndroid Build Coastguard Worker     }
374*2e9d4914SAndroid Build Coastguard Worker     else
375*2e9d4914SAndroid Build Coastguard Worker     {
376*2e9d4914SAndroid Build Coastguard Worker       ctx->setting->type = CONFIG_TYPE_GROUP;
377*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = ctx->setting;
378*2e9d4914SAndroid Build Coastguard Worker       ctx->setting = NULL;
379*2e9d4914SAndroid Build Coastguard Worker     }
380*2e9d4914SAndroid Build Coastguard Worker   }
381*2e9d4914SAndroid Build Coastguard Worker   setting_list_optional
382*2e9d4914SAndroid Build Coastguard Worker   TOK_GROUP_END
383*2e9d4914SAndroid Build Coastguard Worker   {
384*2e9d4914SAndroid Build Coastguard Worker     if(ctx->parent)
385*2e9d4914SAndroid Build Coastguard Worker       ctx->parent = ctx->parent->parent;
386*2e9d4914SAndroid Build Coastguard Worker   }
387*2e9d4914SAndroid Build Coastguard Worker   ;
388*2e9d4914SAndroid Build Coastguard Worker 
389*2e9d4914SAndroid Build Coastguard Worker %%
390