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.
33 * POSIX localedef grammar.
39 #include "localedef.h"
91 %token T_COLLATING_SYMBOL
92 %token T_COLLATING_ELEMENT
107 %token T_INT_CURR_SYMBOL
108 %token T_CURRENCY_SYMBOL
109 %token T_MON_DECIMAL_POINT
110 %token T_MON_THOUSANDS_SEP
111 %token T_POSITIVE_SIGN
112 %token T_NEGATIVE_SIGN
113 %token T_MON_GROUPING
114 %token T_INT_FRAC_DIGITS
116 %token T_P_CS_PRECEDES
117 %token T_P_SEP_BY_SPACE
118 %token T_N_CS_PRECEDES
119 %token T_N_SEP_BY_SPACE
122 %token T_INT_P_CS_PRECEDES
123 %token T_INT_N_CS_PRECEDES
124 %token T_INT_P_SEP_BY_SPACE
125 %token T_INT_N_SEP_BY_SPACE
126 %token T_INT_P_SIGN_POSN
127 %token T_INT_N_SIGN_POSN
129 %token T_DECIMAL_POINT
130 %token T_THOUSANDS_SEP
149 %token
<token
> T_NAME
150 %token
<num
> T_NUMBER
151 %token
<token
> T_SYMBOL
152 %token
<collsym
> T_COLLSYM
153 %token
<collelem
> T_COLLELEM
157 localedef
: setting_list categories
161 string : T_QUOTE charlist T_QUOTE
165 charlist
: charlist T_CHAR
175 setting_list
: setting_list setting
180 setting
: T_COM_CHAR T_CHAR T_NL
184 | T_ESC_CHAR T_CHAR T_NL
188 | T_MB_CUR_MAX T_NUMBER T_NL
192 | T_MB_CUR_MIN T_NUMBER T_NL
196 | T_CODE_SET
string T_NL
198 wchar_t *w
= get_wcs
();
199 set_wide_encoding
(to_mb_string
(w
));
202 | T_CODE_SET T_NAME T_NL
204 set_wide_encoding
($2);
208 copycat
: T_COPY T_NAME T_NL
214 wchar_t *w
= get_wcs
();
215 copy_category
(to_mb_string
(w
));
220 categories
: categories category
235 charmap
: T_CHARMAP T_NL charmap_list T_END T_CHARMAP T_NL
236 | T_WIDTH T_NL width_list T_END T_WIDTH T_NL
240 charmap_list
: charmap_list charmap_entry
245 charmap_entry
: T_SYMBOL T_CHAR
250 | T_SYMBOL T_ELLIPSIS T_SYMBOL T_CHAR
252 add_charmap_range
($1, $3, $4);
258 width_list
: width_list width_entry
262 width_entry
: T_CHAR T_NUMBER T_NL
266 | T_SYMBOL T_NUMBER T_NL
268 add_charmap_undefined
($1);
270 | T_CHAR T_ELLIPSIS T_CHAR T_NUMBER T_NL
272 add_width_range
($1, $3, $4);
274 | T_SYMBOL T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
276 add_charmap_undefined
($1);
277 add_charmap_undefined
($3);
279 | T_CHAR T_ELLIPSIS T_SYMBOL T_NUMBER T_NL
282 add_charmap_undefined
($3);
284 | T_SYMBOL T_ELLIPSIS T_CHAR T_NUMBER T_NL
287 add_charmap_undefined
($1);
292 ctype
: T_CTYPE T_NL ctype_list T_END T_CTYPE T_NL
296 | T_CTYPE T_NL copycat T_END T_CTYPE T_NL
299 ctype_list
: ctype_list ctype_kw
303 ctype_kw
: T_ISUPPER cc_list T_NL
304 | T_ISLOWER cc_list T_NL
305 | T_ISALPHA cc_list T_NL
306 | T_ISDIGIT cc_list T_NL
307 | T_ISPUNCT cc_list T_NL
308 | T_ISXDIGIT cc_list T_NL
309 | T_ISSPACE cc_list T_NL
310 | T_ISPRINT cc_list T_NL
311 | T_ISGRAPH cc_list T_NL
312 | T_ISBLANK cc_list T_NL
313 | T_ISCNTRL cc_list T_NL
314 | T_ISALNUM cc_list T_NL
315 | T_ISSPECIAL cc_list T_NL
316 | T_ISENGLISH cc_list T_NL
317 | T_ISNUMBER cc_list T_NL
318 | T_ISIDEOGRAM cc_list T_NL
319 | T_ISPHONOGRAM cc_list T_NL
320 | T_TOUPPER conv_list T_NL
321 | T_TOLOWER conv_list T_NL
325 cc_list
: cc_list T_SEMI T_CHAR
329 | cc_list T_SEMI T_SYMBOL
331 add_charmap_undefined
($3);
333 | cc_list T_SEMI T_ELLIPSIS T_SEMI T_CHAR
335 /* note that the endpoints *must* be characters */
344 add_charmap_undefined
($1);
348 conv_list
: conv_list T_SEMI conv_pair
353 conv_pair
: T_LPAREN T_CHAR T_COMMA T_CHAR T_RPAREN
355 add_caseconv
($2, $4);
357 | T_LPAREN T_SYMBOL T_COMMA T_CHAR T_RPAREN
359 add_charmap_undefined
($2);
361 | T_LPAREN T_SYMBOL T_COMMA T_SYMBOL T_RPAREN
363 add_charmap_undefined
($2);
364 add_charmap_undefined
($4);
366 | T_LPAREN T_CHAR T_COMMA T_SYMBOL T_RPAREN
368 add_charmap_undefined
($4);
372 collate
: T_COLLATE T_NL coll_order T_END T_COLLATE T_NL
376 | T_COLLATE T_NL coll_optional coll_order T_END T_COLLATE T_NL
380 | T_COLLATE T_NL copycat T_END T_COLLATE T_NL
384 coll_optional
: coll_optional coll_symbols
385 | coll_optional coll_elements
391 coll_symbols
: T_COLLATING_SYMBOL T_SYMBOL T_NL
398 coll_elements
: T_COLLATING_ELEMENT T_SYMBOL T_FROM
string T_NL
400 define_collelem
($2, get_wcs
());
404 coll_order
: T_ORDER_START T_NL order_list T_ORDER_END T_NL
406 /* If no order list supplied default to one forward */
407 add_order_bit
(T_FORWARD
);
408 add_order_directive
();
410 | T_ORDER_START order_args T_NL order_list T_ORDER_END T_NL
414 order_args
: order_args T_SEMI order_arg
416 add_order_directive
();
420 add_order_directive
();
424 order_arg
: order_arg T_COMMA order_dir
428 order_dir
: T_FORWARD
430 add_order_bit
(T_FORWARD
);
434 add_order_bit
(T_BACKWARD
);
438 add_order_bit
(T_POSITION
);
442 order_list
: order_list order_item
446 order_item
: T_COLLSYM T_NL
448 end_order_collsym
($1);
454 | order_itemkw order_weights T_NL
460 order_itemkw
: T_CHAR
462 start_order_char
($1);
466 start_order_ellipsis
();
470 start_order_collelem
($1);
474 start_order_undefined
();
478 start_order_symbol
($1);
482 order_weights
: order_weights T_SEMI order_weight
483 | order_weights T_SEMI
487 order_weight
: T_COLLELEM
489 add_order_collelem
($1);
493 add_order_collsym
($1);
501 add_order_ellipsis
();
509 add_order_symbol
($1);
511 | T_QUOTE order_str T_QUOTE
517 order_str
: order_str order_stritem
521 order_stritem
: T_CHAR
527 add_subst_collsym
($1);
531 add_subst_collelem
($1);
535 add_subst_symbol
($1);
539 messages
: T_MESSAGES T_NL messages_list T_END T_MESSAGES T_NL
543 | T_MESSAGES T_NL copycat T_END T_MESSAGES T_NL
546 messages_list
: messages_list messages_item
550 messages_kw
: T_YESSTR
556 messages_item
: messages_kw
string T_NL
558 add_message
(get_wcs
());
562 monetary
: T_MONETARY T_NL monetary_list T_END T_MONETARY T_NL
566 | T_MONETARY T_NL copycat T_END T_MONETARY T_NL
569 monetary_list
: monetary_list monetary_kw
573 monetary_strkw
: T_INT_CURR_SYMBOL
575 | T_MON_DECIMAL_POINT
576 | T_MON_THOUSANDS_SEP
581 monetary_numkw
: T_INT_FRAC_DIGITS
589 | T_INT_P_CS_PRECEDES
590 | T_INT_N_CS_PRECEDES
591 | T_INT_P_SEP_BY_SPACE
592 | T_INT_N_SEP_BY_SPACE
597 monetary_kw
: monetary_strkw
string T_NL
599 add_monetary_str
(get_wcs
());
601 | monetary_numkw T_NUMBER T_NL
603 add_monetary_num
($2);
605 | T_MON_GROUPING mon_group_list T_NL
608 mon_group_list
: T_NUMBER
610 reset_monetary_group
();
611 add_monetary_group
($1);
613 | mon_group_list T_SEMI T_NUMBER
615 add_monetary_group
($3);
620 numeric
: T_NUMERIC T_NL numeric_list T_END T_NUMERIC T_NL
624 | T_NUMERIC T_NL copycat T_END T_NUMERIC T_NL
628 numeric_list
: numeric_list numeric_item
633 numeric_item
: numeric_strkw
string T_NL
635 add_numeric_str
(get_wcs
());
637 | T_GROUPING group_list T_NL
640 numeric_strkw
: T_DECIMAL_POINT
645 group_list
: T_NUMBER
647 reset_numeric_group
();
648 add_numeric_group
($1);
650 | group_list T_SEMI T_NUMBER
652 add_numeric_group
($3);
657 time
: T_TIME T_NL time_kwlist T_END T_TIME T_NL
661 | T_TIME T_NL copycat T_END T_NUMERIC T_NL
664 time_kwlist
: time_kwlist time_kw
668 time_kw
: time_strkw
string T_NL
670 add_time_str
(get_wcs
());
672 | time_listkw time_list T_NL
678 time_listkw
: T_ABDAY
687 time_strkw
: T_ERA_D_T_FMT
697 time_list
: time_list T_SEMI
string
699 add_time_list
(get_wcs
());
704 add_time_list
(get_wcs
());