1286432Sbapt%{
2286432Sbapt/*
3286432Sbapt * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
4286432Sbapt * Copyright 2015 John Marino <draco@marino.st>
5286432Sbapt *
6286432Sbapt * This source code is derived from the illumos localedef command, and
7286432Sbapt * provided under BSD-style license terms by Nexenta Systems, Inc.
8286432Sbapt *
9286432Sbapt * Redistribution and use in source and binary forms, with or without
10286432Sbapt * modification, are permitted provided that the following conditions
11286432Sbapt * are met:
12286432Sbapt *
13286432Sbapt * 1. Redistributions of source code must retain the above copyright
14286432Sbapt *    notice, this list of conditions and the following disclaimer.
15286432Sbapt * 2. Redistributions in binary form must reproduce the above copyright
16286432Sbapt *    notice, this list of conditions and the following disclaimer in the
17286432Sbapt *    documentation and/or other materials provided with the distribution.
18286432Sbapt *
19286432Sbapt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20286432Sbapt * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21286432Sbapt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22286432Sbapt * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23286432Sbapt * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24286432Sbapt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25286432Sbapt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26286432Sbapt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27286432Sbapt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28286432Sbapt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29286432Sbapt * POSSIBILITY OF SUCH DAMAGE.
30308330Sbapt *
31308330Sbapt * $FreeBSD: stable/11/usr.bin/localedef/parser.y 308330 2016-11-05 09:46:48Z bapt $
32286432Sbapt */
33286432Sbapt
34286432Sbapt/*
35286432Sbapt * POSIX localedef grammar.
36286432Sbapt */
37286432Sbapt
38286432Sbapt#include <wchar.h>
39286432Sbapt#include <stdio.h>
40286432Sbapt#include <limits.h>
41286432Sbapt#include "localedef.h"
42286432Sbapt
43286432Sbapt%}
44286432Sbapt%union {
45286432Sbapt	int		num;
46286432Sbapt	wchar_t		wc;
47286432Sbapt	char		*token;
48286432Sbapt	collsym_t	*collsym;
49286432Sbapt	collelem_t	*collelem;
50286432Sbapt}
51286432Sbapt
52286432Sbapt%token		T_CODE_SET
53286432Sbapt%token		T_MB_CUR_MAX
54286432Sbapt%token		T_MB_CUR_MIN
55286432Sbapt%token		T_COM_CHAR
56286432Sbapt%token		T_ESC_CHAR
57286432Sbapt%token		T_LT
58286432Sbapt%token		T_GT
59286432Sbapt%token		T_NL
60286432Sbapt%token		T_SEMI
61286432Sbapt%token		T_COMMA
62286432Sbapt%token		T_ELLIPSIS
63286432Sbapt%token		T_RPAREN
64286432Sbapt%token		T_LPAREN
65286432Sbapt%token		T_QUOTE
66286432Sbapt%token		T_NULL
67286432Sbapt%token		T_WS
68286432Sbapt%token		T_END
69286432Sbapt%token		T_COPY
70286432Sbapt%token		T_CHARMAP
71286432Sbapt%token		T_WIDTH
72286432Sbapt%token		T_CTYPE
73286432Sbapt%token		T_ISUPPER
74286432Sbapt%token		T_ISLOWER
75286432Sbapt%token		T_ISALPHA
76286432Sbapt%token		T_ISDIGIT
77286432Sbapt%token		T_ISPUNCT
78286432Sbapt%token		T_ISXDIGIT
79286432Sbapt%token		T_ISSPACE
80286432Sbapt%token		T_ISPRINT
81286432Sbapt%token		T_ISGRAPH
82286432Sbapt%token		T_ISBLANK
83286432Sbapt%token		T_ISCNTRL
84286432Sbapt%token		T_ISALNUM
85286432Sbapt%token		T_ISSPECIAL
86286432Sbapt%token		T_ISPHONOGRAM
87286432Sbapt%token		T_ISIDEOGRAM
88286432Sbapt%token		T_ISENGLISH
89286432Sbapt%token		T_ISNUMBER
90286432Sbapt%token		T_TOUPPER
91286432Sbapt%token		T_TOLOWER
92286432Sbapt%token		T_COLLATE
93286432Sbapt%token		T_COLLATING_SYMBOL
94286432Sbapt%token		T_COLLATING_ELEMENT
95286432Sbapt%token		T_ORDER_START
96286432Sbapt%token		T_ORDER_END
97286432Sbapt%token		T_FORWARD
98286432Sbapt%token		T_BACKWARD
99286432Sbapt%token		T_POSITION
100286432Sbapt%token		T_FROM
101286432Sbapt%token		T_UNDEFINED
102286432Sbapt%token		T_IGNORE
103286432Sbapt%token		T_MESSAGES
104286432Sbapt%token		T_YESSTR
105286432Sbapt%token		T_NOSTR
106286432Sbapt%token		T_YESEXPR
107286432Sbapt%token		T_NOEXPR
108286432Sbapt%token		T_MONETARY
109286432Sbapt%token		T_INT_CURR_SYMBOL
110286432Sbapt%token		T_CURRENCY_SYMBOL
111286432Sbapt%token		T_MON_DECIMAL_POINT
112286432Sbapt%token		T_MON_THOUSANDS_SEP
113286432Sbapt%token		T_POSITIVE_SIGN
114286432Sbapt%token		T_NEGATIVE_SIGN
115286432Sbapt%token		T_MON_GROUPING
116286432Sbapt%token		T_INT_FRAC_DIGITS
117286432Sbapt%token		T_FRAC_DIGITS
118286432Sbapt%token		T_P_CS_PRECEDES
119286432Sbapt%token		T_P_SEP_BY_SPACE
120286432Sbapt%token		T_N_CS_PRECEDES
121286432Sbapt%token		T_N_SEP_BY_SPACE
122286432Sbapt%token		T_P_SIGN_POSN
123286432Sbapt%token		T_N_SIGN_POSN
124286432Sbapt%token		T_INT_P_CS_PRECEDES
125286432Sbapt%token		T_INT_N_CS_PRECEDES
126286432Sbapt%token		T_INT_P_SEP_BY_SPACE
127286432Sbapt%token		T_INT_N_SEP_BY_SPACE
128286432Sbapt%token		T_INT_P_SIGN_POSN
129286432Sbapt%token		T_INT_N_SIGN_POSN
130286432Sbapt%token		T_NUMERIC
131286432Sbapt%token		T_DECIMAL_POINT
132286432Sbapt%token		T_THOUSANDS_SEP
133286432Sbapt%token		T_GROUPING
134286432Sbapt%token		T_TIME
135286432Sbapt%token		T_ABDAY
136286432Sbapt%token		T_DAY
137286432Sbapt%token		T_ABMON
138286432Sbapt%token		T_MON
139286432Sbapt%token		T_ERA
140286432Sbapt%token		T_ERA_D_FMT
141286432Sbapt%token		T_ERA_T_FMT
142286432Sbapt%token		T_ERA_D_T_FMT
143286432Sbapt%token		T_ALT_DIGITS
144286432Sbapt%token		T_D_T_FMT
145286432Sbapt%token		T_D_FMT
146286432Sbapt%token		T_T_FMT
147286432Sbapt%token		T_AM_PM
148286432Sbapt%token		T_T_FMT_AMPM
149286432Sbapt%token		T_DATE_FMT
150286432Sbapt%token	<wc>		T_CHAR
151286432Sbapt%token	<token>		T_NAME
152286432Sbapt%token	<num>		T_NUMBER
153286432Sbapt%token	<token>		T_SYMBOL
154286432Sbapt%token	<collsym>	T_COLLSYM
155286432Sbapt%token	<collelem>	T_COLLELEM
156286432Sbapt
157286432Sbapt%%
158286432Sbapt
159286432Sbaptlocaledef	: setting_list categories
160286432Sbapt		| categories
161286432Sbapt		;
162286432Sbapt
163286432Sbaptstring		: T_QUOTE charlist T_QUOTE
164286432Sbapt		| T_QUOTE T_QUOTE
165286432Sbapt		;
166286432Sbapt
167286432Sbaptcharlist	: charlist T_CHAR
168286432Sbapt		{
169286432Sbapt			add_wcs($2);
170286432Sbapt		}
171286432Sbapt		| T_CHAR
172286432Sbapt		{
173286432Sbapt			add_wcs($1);
174286432Sbapt		}
175286432Sbapt		;
176286432Sbapt
177286432Sbaptsetting_list	: setting_list setting
178286432Sbapt		| setting
179286432Sbapt		;
180286432Sbapt
181286432Sbapt
182286432Sbaptsetting		: T_COM_CHAR T_CHAR T_NL
183286432Sbapt		{
184286432Sbapt			com_char = $2;
185286432Sbapt		}
186286432Sbapt		| T_ESC_CHAR T_CHAR T_NL
187286432Sbapt		{
188286432Sbapt			esc_char = $2;
189286432Sbapt		}
190286432Sbapt		| T_MB_CUR_MAX T_NUMBER T_NL
191286432Sbapt		{
192286432Sbapt			mb_cur_max = $2;
193286432Sbapt		}
194286432Sbapt		| T_MB_CUR_MIN T_NUMBER T_NL
195286432Sbapt		{
196286432Sbapt			mb_cur_min = $2;
197286432Sbapt		}
198286432Sbapt		| T_CODE_SET string T_NL
199286432Sbapt		{
200286432Sbapt			wchar_t *w = get_wcs();
201286432Sbapt			set_wide_encoding(to_mb_string(w));
202286432Sbapt			free(w);
203286432Sbapt		}
204286432Sbapt		| T_CODE_SET T_NAME T_NL
205286432Sbapt		{
206286432Sbapt			set_wide_encoding($2);
207286432Sbapt		}
208286432Sbapt		;
209286432Sbapt
210286432Sbaptcopycat		: T_COPY T_NAME T_NL
211286432Sbapt		{
212286432Sbapt			copy_category($2);
213286432Sbapt		}
214286432Sbapt		| T_COPY string T_NL
215286432Sbapt		{
216286432Sbapt			wchar_t *w = get_wcs();
217286432Sbapt			copy_category(to_mb_string(w));
218286432Sbapt			free(w);
219286432Sbapt		}
220286432Sbapt		;
221286432Sbapt
222286432Sbaptcategories	: categories category
223286432Sbapt		| category
224286432Sbapt		;
225286432Sbapt
226286432Sbapt
227286432Sbaptcategory	: charmap
228286432Sbapt		| messages
229286432Sbapt		| monetary
230286432Sbapt		| ctype
231286432Sbapt		| collate
232286432Sbapt		| numeric
233286432Sbapt		| time
234286432Sbapt		;
235286432Sbapt
236286432Sbapt
237286432Sbaptcharmap		: T_CHARMAP T_NL charmap_list T_END T_CHARMAP T_NL
238286432Sbapt		| T_WIDTH T_NL width_list T_END T_WIDTH T_NL
239286432Sbapt		;
240286432Sbapt
241286432Sbapt
242286432Sbaptcharmap_list	: charmap_list charmap_entry
243286432Sbapt		| charmap_entry
244286432Sbapt		;
245286432Sbapt
246286432Sbapt
247286432Sbaptcharmap_entry	: T_SYMBOL T_CHAR
248286432Sbapt		{
249286432Sbapt			add_charmap($1, $2);
250286432Sbapt			scan_to_eol();
251286432Sbapt		}
252286432Sbapt		| T_SYMBOL T_ELLIPSIS T_SYMBOL T_CHAR
253286432Sbapt		{
254286432Sbapt			add_charmap_range($1, $3, $4);
255286432Sbapt			scan_to_eol();
256286432Sbapt		}
257286432Sbapt		| T_NL
258286432Sbapt		;
259286432Sbapt
260286432Sbaptwidth_list	: width_list width_entry
261286432Sbapt		| width_entry
262286432Sbapt		;
263286432Sbapt
264286432Sbaptwidth_entry	: T_CHAR T_NUMBER T_NL
265286432Sbapt		{
266286432Sbapt			add_width($1, $2);
267286432Sbapt		}
268286432Sbapt		| T_SYMBOL T_NUMBER T_NL
269286432Sbapt		{
270286432Sbapt			add_charmap_undefined($1);
271286432Sbapt		}
272286432Sbapt		| T_CHAR T_ELLIPSIS T_CHAR T_NUMBER T_NL
273286432Sbapt		{
274286432Sbapt			add_width_range($1, $3, $4);
275286432Sbapt		}
276286432Sbapt		| T_SYMBOL T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
277286432Sbapt		{
278286432Sbapt			add_charmap_undefined($1);
279286432Sbapt			add_charmap_undefined($3);
280286432Sbapt		}
281286432Sbapt		| T_CHAR T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
282286432Sbapt		{
283286432Sbapt			add_width($1, $4);
284286432Sbapt			add_charmap_undefined($3);
285286432Sbapt		}
286286432Sbapt		| T_SYMBOL T_ELLIPSIS T_CHAR T_NUMBER T_NL
287286432Sbapt		{
288286432Sbapt			add_width($3, $4);
289286432Sbapt			add_charmap_undefined($1);
290286432Sbapt		}
291286432Sbapt		| T_NL
292286432Sbapt		;
293286432Sbapt
294286432Sbaptctype		: T_CTYPE T_NL ctype_list T_END T_CTYPE T_NL
295286432Sbapt		{
296286432Sbapt			dump_ctype();
297286432Sbapt		}
298286432Sbapt		| T_CTYPE T_NL copycat  T_END T_CTYPE T_NL
299286432Sbapt		;
300286432Sbapt
301286432Sbaptctype_list	: ctype_list ctype_kw
302286432Sbapt		| ctype_kw
303286432Sbapt		;
304286432Sbapt
305286432Sbaptctype_kw	: T_ISUPPER cc_list T_NL
306286432Sbapt		| T_ISLOWER cc_list T_NL
307286432Sbapt		| T_ISALPHA cc_list T_NL
308286432Sbapt		| T_ISDIGIT cc_list T_NL
309286432Sbapt		| T_ISPUNCT cc_list T_NL
310286432Sbapt		| T_ISXDIGIT cc_list T_NL
311286432Sbapt		| T_ISSPACE cc_list T_NL
312286432Sbapt		| T_ISPRINT cc_list T_NL
313286432Sbapt		| T_ISGRAPH cc_list T_NL
314286432Sbapt		| T_ISBLANK cc_list T_NL
315286432Sbapt		| T_ISCNTRL cc_list T_NL
316286432Sbapt		| T_ISALNUM cc_list T_NL
317286432Sbapt		| T_ISSPECIAL cc_list T_NL
318286432Sbapt		| T_ISENGLISH cc_list T_NL
319286432Sbapt		| T_ISNUMBER cc_list T_NL
320286432Sbapt		| T_ISIDEOGRAM cc_list T_NL
321286432Sbapt		| T_ISPHONOGRAM cc_list T_NL
322286432Sbapt		| T_TOUPPER conv_list T_NL
323286432Sbapt		| T_TOLOWER conv_list T_NL
324286432Sbapt		;
325286432Sbapt
326308330Sbaptcc_list		: cc_list T_SEMI cc_range_end
327308330Sbapt		| cc_list T_SEMI cc_char
328308330Sbapt		| cc_char
329308330Sbapt		;
330286432Sbapt
331308330Sbaptcc_range_end	: T_ELLIPSIS T_SEMI T_CHAR
332286432Sbapt		{
333308330Sbapt			add_ctype_range($3);
334286432Sbapt		}
335308330Sbapt		;
336308330Sbapt
337308330Sbaptcc_char		: T_CHAR
338286432Sbapt		{
339286432Sbapt			add_ctype($1);
340286432Sbapt		}
341286432Sbapt		| T_SYMBOL
342286432Sbapt		{
343286432Sbapt			add_charmap_undefined($1);
344286432Sbapt		}
345286432Sbapt		;
346286432Sbapt
347286432Sbaptconv_list	: conv_list T_SEMI conv_pair
348286432Sbapt		| conv_pair
349286432Sbapt		;
350286432Sbapt
351286432Sbapt
352286432Sbaptconv_pair	: T_LPAREN T_CHAR T_COMMA T_CHAR T_RPAREN
353286432Sbapt		{
354286432Sbapt			add_caseconv($2, $4);
355286432Sbapt		}
356286432Sbapt		| T_LPAREN T_SYMBOL T_COMMA T_CHAR T_RPAREN
357286432Sbapt		{
358286432Sbapt			add_charmap_undefined($2);
359286432Sbapt		}
360286432Sbapt		| T_LPAREN T_SYMBOL T_COMMA T_SYMBOL T_RPAREN
361286432Sbapt		{
362286432Sbapt			add_charmap_undefined($2);
363286432Sbapt			add_charmap_undefined($4);
364286432Sbapt		}
365286432Sbapt		| T_LPAREN T_CHAR T_COMMA T_SYMBOL T_RPAREN
366286432Sbapt		{
367286432Sbapt			add_charmap_undefined($4);
368286432Sbapt		}
369286432Sbapt		;
370286432Sbapt
371286432Sbaptcollate		: T_COLLATE T_NL coll_order T_END T_COLLATE T_NL
372286432Sbapt		{
373286432Sbapt			dump_collate();
374286432Sbapt		}
375286432Sbapt		| T_COLLATE T_NL coll_optional coll_order T_END T_COLLATE T_NL
376286432Sbapt		{
377286432Sbapt			dump_collate();
378286432Sbapt		}
379286432Sbapt		| T_COLLATE T_NL copycat T_END T_COLLATE T_NL
380286432Sbapt		;
381286432Sbapt
382286432Sbapt
383286432Sbaptcoll_optional	: coll_optional coll_symbols
384286432Sbapt		| coll_optional coll_elements
385286432Sbapt		| coll_symbols
386286432Sbapt		| coll_elements
387286432Sbapt		;
388286432Sbapt
389286432Sbapt
390286432Sbaptcoll_symbols	: T_COLLATING_SYMBOL T_SYMBOL T_NL
391286432Sbapt		{
392286432Sbapt			define_collsym($2);
393286432Sbapt		}
394286432Sbapt		;
395286432Sbapt
396286432Sbapt
397286432Sbaptcoll_elements	: T_COLLATING_ELEMENT T_SYMBOL T_FROM string T_NL
398286432Sbapt		{
399286432Sbapt			define_collelem($2, get_wcs());
400286432Sbapt		}
401286432Sbapt		;
402286432Sbapt
403286432Sbaptcoll_order	: T_ORDER_START T_NL order_list T_ORDER_END T_NL
404286432Sbapt		{
405286432Sbapt			/* If no order list supplied default to one forward */
406286432Sbapt			add_order_bit(T_FORWARD);
407286432Sbapt			add_order_directive();
408286432Sbapt		}
409286432Sbapt		| T_ORDER_START order_args T_NL order_list T_ORDER_END T_NL
410286432Sbapt		;
411286432Sbapt
412286432Sbapt
413286432Sbaptorder_args	: order_args T_SEMI order_arg
414286432Sbapt		{
415286432Sbapt			add_order_directive();
416286432Sbapt		}
417286432Sbapt		| order_arg
418286432Sbapt		{
419286432Sbapt			add_order_directive();
420286432Sbapt		}
421286432Sbapt		;
422286432Sbapt
423286432Sbaptorder_arg	: order_arg T_COMMA order_dir
424286432Sbapt		| order_dir
425286432Sbapt		;
426286432Sbapt
427286432Sbaptorder_dir	: T_FORWARD
428286432Sbapt		{
429286432Sbapt			add_order_bit(T_FORWARD);
430286432Sbapt		}
431286432Sbapt		| T_BACKWARD
432286432Sbapt		{
433286432Sbapt			add_order_bit(T_BACKWARD);
434286432Sbapt		}
435286432Sbapt		| T_POSITION
436286432Sbapt		{
437286432Sbapt			add_order_bit(T_POSITION);
438286432Sbapt		}
439286432Sbapt		;
440286432Sbapt
441286432Sbaptorder_list	: order_list order_item
442286432Sbapt		| order_item
443286432Sbapt		;
444286432Sbapt
445286432Sbaptorder_item	: T_COLLSYM T_NL
446286432Sbapt		{
447286432Sbapt			end_order_collsym($1);
448286432Sbapt		}
449286432Sbapt		| order_itemkw T_NL
450286432Sbapt		{
451286432Sbapt			end_order();
452286432Sbapt		}
453286432Sbapt		| order_itemkw order_weights T_NL
454286432Sbapt		{
455286432Sbapt			end_order();
456286432Sbapt		}
457286432Sbapt		;
458286432Sbapt
459286432Sbaptorder_itemkw	: T_CHAR
460286432Sbapt		{
461286432Sbapt			start_order_char($1);
462286432Sbapt		}
463286432Sbapt		| T_ELLIPSIS
464286432Sbapt		{
465286432Sbapt			start_order_ellipsis();
466286432Sbapt		}
467286432Sbapt		| T_COLLELEM
468286432Sbapt		{
469286432Sbapt			start_order_collelem($1);
470286432Sbapt		}
471286432Sbapt		| T_UNDEFINED
472286432Sbapt		{
473286432Sbapt			start_order_undefined();
474286432Sbapt		}
475286432Sbapt		| T_SYMBOL
476286432Sbapt		{
477286432Sbapt			start_order_symbol($1);
478286432Sbapt		}
479286432Sbapt		;
480286432Sbapt
481286432Sbaptorder_weights	: order_weights T_SEMI order_weight
482286432Sbapt		| order_weights T_SEMI
483286432Sbapt		| order_weight
484286432Sbapt		;
485286432Sbapt
486286432Sbaptorder_weight	: T_COLLELEM
487286432Sbapt		{
488286432Sbapt			add_order_collelem($1);
489286432Sbapt		}
490286432Sbapt		| T_COLLSYM
491286432Sbapt		{
492286432Sbapt			add_order_collsym($1);
493286432Sbapt		}
494286432Sbapt		| T_CHAR
495286432Sbapt		{
496286432Sbapt			add_order_char($1);
497286432Sbapt		}
498286432Sbapt		| T_ELLIPSIS
499286432Sbapt		{
500286432Sbapt			add_order_ellipsis();
501286432Sbapt		}
502286432Sbapt		| T_IGNORE
503286432Sbapt		{
504286432Sbapt			add_order_ignore();
505286432Sbapt		}
506286432Sbapt		| T_SYMBOL
507286432Sbapt		{
508286432Sbapt			add_order_symbol($1);
509286432Sbapt		}
510286432Sbapt		| T_QUOTE order_str T_QUOTE
511286432Sbapt		{
512286432Sbapt			add_order_subst();
513286432Sbapt		}
514286432Sbapt		;
515286432Sbapt
516286432Sbaptorder_str	: order_str order_stritem
517286432Sbapt		| order_stritem
518286432Sbapt		;
519286432Sbapt
520286432Sbaptorder_stritem	: T_CHAR
521286432Sbapt		{
522286432Sbapt			add_subst_char($1);
523286432Sbapt		}
524286432Sbapt		| T_COLLSYM
525286432Sbapt		{
526286432Sbapt			add_subst_collsym($1);
527286432Sbapt		}
528286432Sbapt		| T_COLLELEM
529286432Sbapt		{
530286432Sbapt			add_subst_collelem($1);
531286432Sbapt		}
532286432Sbapt		| T_SYMBOL
533286432Sbapt		{
534286432Sbapt			add_subst_symbol($1);
535286432Sbapt		}
536286432Sbapt		;
537286432Sbapt
538286432Sbaptmessages	: T_MESSAGES T_NL messages_list T_END T_MESSAGES T_NL
539286432Sbapt		{
540286432Sbapt			dump_messages();
541286432Sbapt		}
542286432Sbapt		| T_MESSAGES T_NL copycat T_END T_MESSAGES T_NL
543286432Sbapt		;
544286432Sbapt
545286432Sbaptmessages_list	: messages_list messages_item
546286432Sbapt		| messages_item
547286432Sbapt		;
548286432Sbapt
549286432Sbaptmessages_kw	: T_YESSTR
550286432Sbapt		| T_NOSTR
551286432Sbapt		| T_YESEXPR
552286432Sbapt		| T_NOEXPR
553286432Sbapt		;
554286432Sbapt
555286432Sbaptmessages_item	: messages_kw string T_NL
556286432Sbapt		{
557286432Sbapt			add_message(get_wcs());
558286432Sbapt		}
559286432Sbapt		;
560286432Sbapt
561286432Sbaptmonetary	: T_MONETARY T_NL monetary_list T_END T_MONETARY T_NL
562286432Sbapt		{
563286432Sbapt			dump_monetary();
564286432Sbapt		}
565286432Sbapt		| T_MONETARY T_NL copycat T_END T_MONETARY T_NL
566286432Sbapt		;
567286432Sbapt
568286432Sbaptmonetary_list	: monetary_list monetary_kw
569286432Sbapt		| monetary_kw
570286432Sbapt		;
571286432Sbapt
572286432Sbaptmonetary_strkw	: T_INT_CURR_SYMBOL
573286432Sbapt		| T_CURRENCY_SYMBOL
574286432Sbapt		| T_MON_DECIMAL_POINT
575286432Sbapt		| T_MON_THOUSANDS_SEP
576286432Sbapt		| T_POSITIVE_SIGN
577286432Sbapt		| T_NEGATIVE_SIGN
578286432Sbapt		;
579286432Sbapt
580286432Sbaptmonetary_numkw	: T_INT_FRAC_DIGITS
581286432Sbapt		| T_FRAC_DIGITS
582286432Sbapt		| T_P_CS_PRECEDES
583286432Sbapt		| T_P_SEP_BY_SPACE
584286432Sbapt		| T_N_CS_PRECEDES
585286432Sbapt		| T_N_SEP_BY_SPACE
586286432Sbapt		| T_P_SIGN_POSN
587286432Sbapt		| T_N_SIGN_POSN
588286432Sbapt		| T_INT_P_CS_PRECEDES
589286432Sbapt		| T_INT_N_CS_PRECEDES
590286432Sbapt		| T_INT_P_SEP_BY_SPACE
591286432Sbapt		| T_INT_N_SEP_BY_SPACE
592286432Sbapt		| T_INT_P_SIGN_POSN
593286432Sbapt		| T_INT_N_SIGN_POSN
594286432Sbapt		;
595286432Sbapt
596286432Sbaptmonetary_kw	: monetary_strkw string T_NL
597286432Sbapt		{
598286432Sbapt			add_monetary_str(get_wcs());
599286432Sbapt		}
600286432Sbapt		| monetary_numkw T_NUMBER T_NL
601286432Sbapt		{
602286432Sbapt			add_monetary_num($2);
603286432Sbapt		}
604286432Sbapt		| T_MON_GROUPING mon_group_list T_NL
605286432Sbapt		;
606286432Sbapt
607286432Sbaptmon_group_list	: T_NUMBER
608286432Sbapt		{
609286432Sbapt			reset_monetary_group();
610286432Sbapt			add_monetary_group($1);
611286432Sbapt		}
612286432Sbapt		| mon_group_list T_SEMI T_NUMBER
613286432Sbapt		{
614286432Sbapt			add_monetary_group($3);
615286432Sbapt		}
616286432Sbapt		;
617286432Sbapt
618286432Sbapt
619286432Sbaptnumeric		: T_NUMERIC T_NL numeric_list T_END T_NUMERIC T_NL
620286432Sbapt		{
621286432Sbapt			dump_numeric();
622286432Sbapt		}
623286432Sbapt		| T_NUMERIC T_NL copycat T_END T_NUMERIC T_NL
624286432Sbapt		;
625286432Sbapt
626286432Sbapt
627286432Sbaptnumeric_list	: numeric_list numeric_item
628286432Sbapt		| numeric_item
629286432Sbapt		;
630286432Sbapt
631286432Sbapt
632286432Sbaptnumeric_item	: numeric_strkw string T_NL
633286432Sbapt		{
634286432Sbapt			add_numeric_str(get_wcs());
635286432Sbapt		}
636286432Sbapt		| T_GROUPING group_list T_NL
637286432Sbapt		;
638286432Sbapt
639286432Sbaptnumeric_strkw	: T_DECIMAL_POINT
640286432Sbapt		| T_THOUSANDS_SEP
641286432Sbapt		;
642286432Sbapt
643286432Sbapt
644286432Sbaptgroup_list	: T_NUMBER
645286432Sbapt		{
646286432Sbapt			reset_numeric_group();
647286432Sbapt			add_numeric_group($1);
648286432Sbapt		}
649286432Sbapt		| group_list T_SEMI T_NUMBER
650286432Sbapt		{
651286432Sbapt			add_numeric_group($3);
652286432Sbapt		}
653286432Sbapt		;
654286432Sbapt
655286432Sbapt
656286432Sbapttime		: T_TIME T_NL time_kwlist T_END T_TIME T_NL
657286432Sbapt		{
658286432Sbapt			dump_time();
659286432Sbapt		}
660286432Sbapt		| T_TIME T_NL copycat T_END T_NUMERIC T_NL
661286432Sbapt		;
662286432Sbapt
663286432Sbapttime_kwlist	: time_kwlist time_kw
664286432Sbapt		| time_kw
665286432Sbapt		;
666286432Sbapt
667286432Sbapttime_kw		: time_strkw string T_NL
668286432Sbapt		{
669286432Sbapt			add_time_str(get_wcs());
670286432Sbapt		}
671286432Sbapt		| time_listkw time_list T_NL
672286432Sbapt		{
673286432Sbapt			check_time_list();
674286432Sbapt		}
675286432Sbapt		;
676286432Sbapt
677286432Sbapttime_listkw	: T_ABDAY
678286432Sbapt		| T_DAY
679286432Sbapt		| T_ABMON
680286432Sbapt		| T_MON
681286432Sbapt		| T_ERA
682286432Sbapt		| T_ALT_DIGITS
683286432Sbapt		| T_AM_PM
684286432Sbapt		;
685286432Sbapt
686286432Sbapttime_strkw	: T_ERA_D_T_FMT
687286432Sbapt		| T_ERA_T_FMT
688286432Sbapt		| T_ERA_D_FMT
689286432Sbapt		| T_D_T_FMT
690286432Sbapt		| T_D_FMT
691286432Sbapt		| T_T_FMT
692286432Sbapt		| T_T_FMT_AMPM
693286432Sbapt		| T_DATE_FMT
694286432Sbapt		;
695286432Sbapt
696286432Sbapttime_list	: time_list T_SEMI string
697286432Sbapt		{
698286432Sbapt			add_time_list(get_wcs());
699286432Sbapt		}
700286432Sbapt		| string
701286432Sbapt		{
702286432Sbapt			reset_time_list();
703286432Sbapt			add_time_list(get_wcs());
704286432Sbapt		}
705286432Sbapt		;
706