3 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
4 * Copyright 2015 John Marino <draco@marino.st>
6 * This source code is derived from the illumos localedef command, and
7 * provided under BSD-style license terms by Nexenta Systems, Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
35 * POSIX localedef grammar.
41 #include "localedef.h"
93 %token T_COLLATING_SYMBOL
94 %token T_COLLATING_ELEMENT
109 %token T_INT_CURR_SYMBOL
110 %token T_CURRENCY_SYMBOL
111 %token T_MON_DECIMAL_POINT
112 %token T_MON_THOUSANDS_SEP
113 %token T_POSITIVE_SIGN
114 %token T_NEGATIVE_SIGN
115 %token T_MON_GROUPING
116 %token T_INT_FRAC_DIGITS
118 %token T_P_CS_PRECEDES
119 %token T_P_SEP_BY_SPACE
120 %token T_N_CS_PRECEDES
121 %token T_N_SEP_BY_SPACE
124 %token T_INT_P_CS_PRECEDES
125 %token T_INT_N_CS_PRECEDES
126 %token T_INT_P_SEP_BY_SPACE
127 %token T_INT_N_SEP_BY_SPACE
128 %token T_INT_P_SIGN_POSN
129 %token T_INT_N_SIGN_POSN
131 %token T_DECIMAL_POINT
132 %token T_THOUSANDS_SEP
151 %token <token> T_NAME
152 %token <num> T_NUMBER
153 %token <token> T_SYMBOL
154 %token <collsym> T_COLLSYM
155 %token <collelem> T_COLLELEM
159 localedef : setting_list categories
163 string : T_QUOTE charlist T_QUOTE
167 charlist : charlist T_CHAR
177 setting_list : setting_list setting
182 setting : T_COM_CHAR T_CHAR T_NL
186 | T_ESC_CHAR T_CHAR T_NL
190 | T_MB_CUR_MAX T_NUMBER T_NL
194 | T_MB_CUR_MIN T_NUMBER T_NL
198 | T_CODE_SET string T_NL
200 wchar_t *w = get_wcs();
201 set_wide_encoding(to_mb_string(w));
204 | T_CODE_SET T_NAME T_NL
206 set_wide_encoding($2);
210 copycat : T_COPY T_NAME T_NL
216 wchar_t *w = get_wcs();
217 copy_category(to_mb_string(w));
222 categories : categories category
237 charmap : T_CHARMAP T_NL charmap_list T_END T_CHARMAP T_NL
238 | T_WIDTH T_NL width_list T_END T_WIDTH T_NL
242 charmap_list : charmap_list charmap_entry
247 charmap_entry : T_SYMBOL T_CHAR
252 | T_SYMBOL T_ELLIPSIS T_SYMBOL T_CHAR
254 add_charmap_range($1, $3, $4);
260 width_list : width_list width_entry
264 width_entry : T_CHAR T_NUMBER T_NL
268 | T_SYMBOL T_NUMBER T_NL
270 add_charmap_undefined($1);
272 | T_CHAR T_ELLIPSIS T_CHAR T_NUMBER T_NL
274 add_width_range($1, $3, $4);
276 | T_SYMBOL T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
278 add_charmap_undefined($1);
279 add_charmap_undefined($3);
281 | T_CHAR T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
284 add_charmap_undefined($3);
286 | T_SYMBOL T_ELLIPSIS T_CHAR T_NUMBER T_NL
289 add_charmap_undefined($1);
294 ctype : T_CTYPE T_NL ctype_list T_END T_CTYPE T_NL
298 | T_CTYPE T_NL copycat T_END T_CTYPE T_NL
301 ctype_list : ctype_list ctype_kw
305 ctype_kw : T_ISUPPER cc_list T_NL
306 | T_ISLOWER cc_list T_NL
307 | T_ISALPHA cc_list T_NL
308 | T_ISDIGIT cc_list T_NL
309 | T_ISPUNCT cc_list T_NL
310 | T_ISXDIGIT cc_list T_NL
311 | T_ISSPACE cc_list T_NL
312 | T_ISPRINT cc_list T_NL
313 | T_ISGRAPH cc_list T_NL
314 | T_ISBLANK cc_list T_NL
315 | T_ISCNTRL cc_list T_NL
316 | T_ISALNUM cc_list T_NL
317 | T_ISSPECIAL cc_list T_NL
318 | T_ISENGLISH cc_list T_NL
319 | T_ISNUMBER cc_list T_NL
320 | T_ISIDEOGRAM cc_list T_NL
321 | T_ISPHONOGRAM cc_list T_NL
322 | T_TOUPPER conv_list T_NL
323 | T_TOLOWER conv_list T_NL
326 cc_list : cc_list T_SEMI cc_range_end
327 | cc_list T_SEMI cc_char
331 cc_range_end : T_ELLIPSIS T_SEMI T_CHAR
343 add_charmap_undefined($1);
347 conv_list : conv_list T_SEMI conv_pair
352 conv_pair : T_LPAREN T_CHAR T_COMMA T_CHAR T_RPAREN
354 add_caseconv($2, $4);
356 | T_LPAREN T_SYMBOL T_COMMA T_CHAR T_RPAREN
358 add_charmap_undefined($2);
360 | T_LPAREN T_SYMBOL T_COMMA T_SYMBOL T_RPAREN
362 add_charmap_undefined($2);
363 add_charmap_undefined($4);
365 | T_LPAREN T_CHAR T_COMMA T_SYMBOL T_RPAREN
367 add_charmap_undefined($4);
371 collate : T_COLLATE T_NL coll_order T_END T_COLLATE T_NL
375 | T_COLLATE T_NL coll_optional coll_order T_END T_COLLATE T_NL
379 | T_COLLATE T_NL copycat T_END T_COLLATE T_NL
383 coll_optional : coll_optional coll_symbols
384 | coll_optional coll_elements
390 coll_symbols : T_COLLATING_SYMBOL T_SYMBOL T_NL
397 coll_elements : T_COLLATING_ELEMENT T_SYMBOL T_FROM string T_NL
399 define_collelem($2, get_wcs());
403 coll_order : T_ORDER_START T_NL order_list T_ORDER_END T_NL
405 /* If no order list supplied default to one forward */
406 add_order_bit(T_FORWARD);
407 add_order_directive();
409 | T_ORDER_START order_args T_NL order_list T_ORDER_END T_NL
413 order_args : order_args T_SEMI order_arg
415 add_order_directive();
419 add_order_directive();
423 order_arg : order_arg T_COMMA order_dir
427 order_dir : T_FORWARD
429 add_order_bit(T_FORWARD);
433 add_order_bit(T_BACKWARD);
437 add_order_bit(T_POSITION);
441 order_list : order_list order_item
445 order_item : T_COLLSYM T_NL
447 end_order_collsym($1);
453 | order_itemkw order_weights T_NL
459 order_itemkw : T_CHAR
461 start_order_char($1);
465 start_order_ellipsis();
469 start_order_collelem($1);
473 start_order_undefined();
477 start_order_symbol($1);
481 order_weights : order_weights T_SEMI order_weight
482 | order_weights T_SEMI
486 order_weight : T_COLLELEM
488 add_order_collelem($1);
492 add_order_collsym($1);
500 add_order_ellipsis();
508 add_order_symbol($1);
510 | T_QUOTE order_str T_QUOTE
516 order_str : order_str order_stritem
520 order_stritem : T_CHAR
526 add_subst_collsym($1);
530 add_subst_collelem($1);
534 add_subst_symbol($1);
538 messages : T_MESSAGES T_NL messages_list T_END T_MESSAGES T_NL
542 | T_MESSAGES T_NL copycat T_END T_MESSAGES T_NL
545 messages_list : messages_list messages_item
549 messages_kw : T_YESSTR
555 messages_item : messages_kw string T_NL
557 add_message(get_wcs());
561 monetary : T_MONETARY T_NL monetary_list T_END T_MONETARY T_NL
565 | T_MONETARY T_NL copycat T_END T_MONETARY T_NL
568 monetary_list : monetary_list monetary_kw
572 monetary_strkw : T_INT_CURR_SYMBOL
574 | T_MON_DECIMAL_POINT
575 | T_MON_THOUSANDS_SEP
580 monetary_numkw : T_INT_FRAC_DIGITS
588 | T_INT_P_CS_PRECEDES
589 | T_INT_N_CS_PRECEDES
590 | T_INT_P_SEP_BY_SPACE
591 | T_INT_N_SEP_BY_SPACE
596 monetary_kw : monetary_strkw string T_NL
598 add_monetary_str(get_wcs());
600 | monetary_numkw T_NUMBER T_NL
602 add_monetary_num($2);
604 | T_MON_GROUPING mon_group_list T_NL
607 mon_group_list : T_NUMBER
609 reset_monetary_group();
610 add_monetary_group($1);
612 | mon_group_list T_SEMI T_NUMBER
614 add_monetary_group($3);
619 numeric : T_NUMERIC T_NL numeric_list T_END T_NUMERIC T_NL
623 | T_NUMERIC T_NL copycat T_END T_NUMERIC T_NL
627 numeric_list : numeric_list numeric_item
632 numeric_item : numeric_strkw string T_NL
634 add_numeric_str(get_wcs());
636 | T_GROUPING group_list T_NL
639 numeric_strkw : T_DECIMAL_POINT
644 group_list : T_NUMBER
646 reset_numeric_group();
647 add_numeric_group($1);
649 | group_list T_SEMI T_NUMBER
651 add_numeric_group($3);
656 time : T_TIME T_NL time_kwlist T_END T_TIME T_NL
660 | T_TIME T_NL copycat T_END T_NUMERIC T_NL
663 time_kwlist : time_kwlist time_kw
667 time_kw : time_strkw string T_NL
669 add_time_str(get_wcs());
671 | time_listkw time_list T_NL
677 time_listkw : T_ABDAY
686 time_strkw : T_ERA_D_T_FMT
696 time_list : time_list T_SEMI string
698 add_time_list(get_wcs());
703 add_time_list(get_wcs());