3 * This file and its contents are supplied under the terms of the
4 * Common Development and Distribution License ("CDDL"), version 1.0.
5 * You may only use this file in accordance with the terms of version
8 * A full copy of the text of the CDDL should have accompanied this
9 * source. A copy of the CDDL is also available via the Internet at
10 * http://www.illumos.org/license/CDDL.
14 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
15 * Copyright 2013 DEY Storage Systems, Inc.
16 * Copyright 2015 John Marino <draco@marino.st>
20 * POSIX localedef grammar.
26 #include "localedef.h"
78 %token T_COLLATING_SYMBOL
79 %token T_COLLATING_ELEMENT
94 %token T_INT_CURR_SYMBOL
95 %token T_CURRENCY_SYMBOL
96 %token T_MON_DECIMAL_POINT
97 %token T_MON_THOUSANDS_SEP
98 %token T_POSITIVE_SIGN
99 %token T_NEGATIVE_SIGN
100 %token T_MON_GROUPING
101 %token T_INT_FRAC_DIGITS
103 %token T_P_CS_PRECEDES
104 %token T_P_SEP_BY_SPACE
105 %token T_N_CS_PRECEDES
106 %token T_N_SEP_BY_SPACE
109 %token T_INT_P_CS_PRECEDES
110 %token T_INT_N_CS_PRECEDES
111 %token T_INT_P_SEP_BY_SPACE
112 %token T_INT_N_SEP_BY_SPACE
113 %token T_INT_P_SIGN_POSN
114 %token T_INT_N_SIGN_POSN
116 %token T_DECIMAL_POINT
117 %token T_THOUSANDS_SEP
136 %token <token> T_NAME
137 %token <num> T_NUMBER
138 %token <token> T_SYMBOL
139 %token <collsym> T_COLLSYM
140 %token <collelem> T_COLLELEM
144 localedef : setting_list categories
148 string : T_QUOTE charlist T_QUOTE
152 charlist : charlist T_CHAR
162 setting_list : setting_list setting
167 setting : T_COM_CHAR T_CHAR T_NL
171 | T_ESC_CHAR T_CHAR T_NL
175 | T_MB_CUR_MAX T_NUMBER T_NL
179 | T_MB_CUR_MIN T_NUMBER T_NL
183 | T_CODE_SET string T_NL
185 wchar_t *w = get_wcs();
186 set_wide_encoding(to_mb_string(w));
189 | T_CODE_SET T_NAME T_NL
191 set_wide_encoding($2);
195 copycat : T_COPY T_NAME T_NL
201 wchar_t *w = get_wcs();
202 copy_category(to_mb_string(w));
207 categories : categories category
222 charmap : T_CHARMAP T_NL charmap_list T_END T_CHARMAP T_NL
223 | T_WIDTH T_NL width_list T_END T_WIDTH T_NL
227 charmap_list : charmap_list charmap_entry
232 charmap_entry : T_SYMBOL T_CHAR
237 | T_SYMBOL T_ELLIPSIS T_SYMBOL T_CHAR
239 add_charmap_range($1, $3, $4);
245 width_list : width_list width_entry
249 width_entry : T_CHAR T_NUMBER T_NL
253 | T_SYMBOL T_NUMBER T_NL
255 add_charmap_undefined($1);
257 | T_CHAR T_ELLIPSIS T_CHAR T_NUMBER T_NL
259 add_width_range($1, $3, $4);
261 | T_SYMBOL T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
263 add_charmap_undefined($1);
264 add_charmap_undefined($3);
266 | T_CHAR T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
269 add_charmap_undefined($3);
271 | T_SYMBOL T_ELLIPSIS T_CHAR T_NUMBER T_NL
274 add_charmap_undefined($1);
279 ctype : T_CTYPE T_NL ctype_list T_END T_CTYPE T_NL
283 | T_CTYPE T_NL copycat T_END T_CTYPE T_NL
286 ctype_list : ctype_list ctype_kw
290 ctype_kw : T_ISUPPER cc_list T_NL
291 | T_ISLOWER cc_list T_NL
292 | T_ISALPHA cc_list T_NL
293 | T_ISDIGIT cc_list T_NL
294 | T_ISPUNCT cc_list T_NL
295 | T_ISXDIGIT cc_list T_NL
296 | T_ISSPACE cc_list T_NL
297 | T_ISPRINT cc_list T_NL
298 | T_ISGRAPH cc_list T_NL
299 | T_ISBLANK cc_list T_NL
300 | T_ISCNTRL cc_list T_NL
301 | T_ISALNUM cc_list T_NL
302 | T_ISSPECIAL cc_list T_NL
303 | T_ISENGLISH cc_list T_NL
304 | T_ISNUMBER cc_list T_NL
305 | T_ISIDEOGRAM cc_list T_NL
306 | T_ISPHONOGRAM cc_list T_NL
307 | T_TOUPPER conv_list T_NL
308 | T_TOLOWER conv_list T_NL
312 cc_list : cc_list T_SEMI T_CHAR
316 | cc_list T_SEMI T_SYMBOL
318 add_charmap_undefined($3);
320 | cc_list T_SEMI T_ELLIPSIS T_SEMI T_CHAR
322 /* note that the endpoints *must* be characters */
331 add_charmap_undefined($1);
335 conv_list : conv_list T_SEMI conv_pair
340 conv_pair : T_LPAREN T_CHAR T_COMMA T_CHAR T_RPAREN
342 add_caseconv($2, $4);
344 | T_LPAREN T_SYMBOL T_COMMA T_CHAR T_RPAREN
346 add_charmap_undefined($2);
348 | T_LPAREN T_SYMBOL T_COMMA T_SYMBOL T_RPAREN
350 add_charmap_undefined($2);
351 add_charmap_undefined($4);
353 | T_LPAREN T_CHAR T_COMMA T_SYMBOL T_RPAREN
355 add_charmap_undefined($4);
359 collate : T_COLLATE T_NL coll_order T_END T_COLLATE T_NL
363 | T_COLLATE T_NL coll_optional coll_order T_END T_COLLATE T_NL
367 | T_COLLATE T_NL copycat T_END T_COLLATE T_NL
371 coll_optional : coll_optional coll_symbols
372 | coll_optional coll_elements
378 coll_symbols : T_COLLATING_SYMBOL T_SYMBOL T_NL
385 coll_elements : T_COLLATING_ELEMENT T_SYMBOL T_FROM string T_NL
387 define_collelem($2, get_wcs());
391 coll_order : T_ORDER_START T_NL order_list T_ORDER_END T_NL
393 /* If no order list supplied default to one forward */
394 add_order_bit(T_FORWARD);
395 add_order_directive();
397 | T_ORDER_START order_args T_NL order_list T_ORDER_END T_NL
401 order_args : order_args T_SEMI order_arg
403 add_order_directive();
407 add_order_directive();
411 order_arg : order_arg T_COMMA order_dir
415 order_dir : T_FORWARD
417 add_order_bit(T_FORWARD);
421 add_order_bit(T_BACKWARD);
425 add_order_bit(T_POSITION);
429 order_list : order_list order_item
433 order_item : T_COLLSYM T_NL
435 end_order_collsym($1);
441 | order_itemkw order_weights T_NL
447 order_itemkw : T_CHAR
449 start_order_char($1);
453 start_order_ellipsis();
457 start_order_collelem($1);
461 start_order_undefined();
465 start_order_symbol($1);
469 order_weights : order_weights T_SEMI order_weight
470 | order_weights T_SEMI
474 order_weight : T_COLLELEM
476 add_order_collelem($1);
480 add_order_collsym($1);
488 add_order_ellipsis();
496 add_order_symbol($1);
498 | T_QUOTE order_str T_QUOTE
504 order_str : order_str order_stritem
508 order_stritem : T_CHAR
514 add_subst_collsym($1);
518 add_subst_collelem($1);
522 add_subst_symbol($1);
526 messages : T_MESSAGES T_NL messages_list T_END T_MESSAGES T_NL
530 | T_MESSAGES T_NL copycat T_END T_MESSAGES T_NL
533 messages_list : messages_list messages_item
537 messages_kw : T_YESSTR
543 messages_item : messages_kw string T_NL
545 add_message(get_wcs());
549 monetary : T_MONETARY T_NL monetary_list T_END T_MONETARY T_NL
553 | T_MONETARY T_NL copycat T_END T_MONETARY T_NL
556 monetary_list : monetary_list monetary_kw
560 monetary_strkw : T_INT_CURR_SYMBOL
562 | T_MON_DECIMAL_POINT
563 | T_MON_THOUSANDS_SEP
568 monetary_numkw : T_INT_FRAC_DIGITS
576 | T_INT_P_CS_PRECEDES
577 | T_INT_N_CS_PRECEDES
578 | T_INT_P_SEP_BY_SPACE
579 | T_INT_N_SEP_BY_SPACE
584 monetary_kw : monetary_strkw string T_NL
586 add_monetary_str(get_wcs());
588 | monetary_numkw T_NUMBER T_NL
590 add_monetary_num($2);
592 | T_MON_GROUPING mon_group_list T_NL
595 mon_group_list : T_NUMBER
597 reset_monetary_group();
598 add_monetary_group($1);
600 | mon_group_list T_SEMI T_NUMBER
602 add_monetary_group($3);
607 numeric : T_NUMERIC T_NL numeric_list T_END T_NUMERIC T_NL
611 | T_NUMERIC T_NL copycat T_END T_NUMERIC T_NL
615 numeric_list : numeric_list numeric_item
620 numeric_item : numeric_strkw string T_NL
622 add_numeric_str(get_wcs());
624 | T_GROUPING group_list T_NL
627 numeric_strkw : T_DECIMAL_POINT
632 group_list : T_NUMBER
634 reset_numeric_group();
635 add_numeric_group($1);
637 | group_list T_SEMI T_NUMBER
639 add_numeric_group($3);
644 time : T_TIME T_NL time_kwlist T_END T_TIME T_NL
648 | T_TIME T_NL copycat T_END T_NUMERIC T_NL
651 time_kwlist : time_kwlist time_kw
655 time_kw : time_strkw string T_NL
657 add_time_str(get_wcs());
659 | time_listkw time_list T_NL
665 time_listkw : T_ABDAY
674 time_strkw : T_ERA_D_T_FMT
684 time_list : time_list T_SEMI string
686 add_time_list(get_wcs());
691 add_time_list(get_wcs());