1 %
{ /* mcparse.y -- parser for Windows mc files
2 Copyright (C) 2007-2024 Free Software Foundation, Inc.
4 Parser for Windows mc files
5 Written by Kai Tietz, Onevision.
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 /* This is a parser for Windows rc files. It is based on the parser
25 by Gunther Ebert <gunther.ebert@ixos-leipzig.de>. */
30 #include "libiberty.h"
32 #include "safe-ctype.h"
34 static rc_uint_type mc_last_id
= 0;
35 static rc_uint_type mc_sefa_val
= 0;
36 static unichar
*mc_last_symbol
= NULL
;
37 static const mc_keyword
*mc_cur_severity
= NULL
;
38 static const mc_keyword
*mc_cur_facility
= NULL
;
39 static mc_node
*cur_node
= NULL
;
47 const mc_keyword
*tok
;
54 %token
<ustr
> MCIDENT MCFILENAME MCLINE MCCOMMENT
57 %token MCLANGUAGENAMES MCFACILITYNAMES MCSEVERITYNAMES MCOUTPUTBASE MCMESSAGEIDTYPEDEF
58 %token MCLANGUAGE MCMESSAGEID MCSEVERITY MCFACILITY MCSYMBOLICNAME
59 %token
<ival
> MCNUMBER
61 %type
<ival
> id vid sefasy_def
62 %type
<ustr
> alias_name token lines comments
73 entity: global_section
77 cur_node
= mc_add_node
();
78 cur_node
->user_text
= $1;
80 |
error { mc_fatal
("syntax error"); }
84 MCSEVERITYNAMES
'=' '(' severitymaps
')'
85 | MCSEVERITYNAMES
'=' '(' severitymaps
error { mc_fatal
("missing ')' in SeverityNames"); }
86 | MCSEVERITYNAMES
'=' error { mc_fatal
("missing '(' in SeverityNames"); }
87 | MCSEVERITYNAMES
error { mc_fatal
("missing '=' for SeverityNames"); }
88 | MCLANGUAGENAMES
'=' '(' langmaps
')'
89 | MCLANGUAGENAMES
'=' '(' langmaps
error { mc_fatal
("missing ')' in LanguageNames"); }
90 | MCLANGUAGENAMES
'=' error { mc_fatal
("missing '(' in LanguageNames"); }
91 | MCLANGUAGENAMES
error { mc_fatal
("missing '=' for LanguageNames"); }
92 | MCFACILITYNAMES
'=' '(' facilitymaps
')'
93 | MCFACILITYNAMES
'=' '(' facilitymaps
error { mc_fatal
("missing ')' in FacilityNames"); }
94 | MCFACILITYNAMES
'=' error { mc_fatal
("missing '(' in FacilityNames"); }
95 | MCFACILITYNAMES
error { mc_fatal
("missing '=' for FacilityNames"); }
96 | MCOUTPUTBASE
'=' MCNUMBER
98 if
($3 != 10 && $3 != 16)
99 mc_fatal
("OutputBase allows 10 or 16 as value");
100 mcset_out_values_are_decimal
= ($3 == 10 ?
1 : 0);
102 | MCMESSAGEIDTYPEDEF
'=' MCIDENT
104 mcset_msg_id_typedef
= $3;
106 | MCMESSAGEIDTYPEDEF
'=' error
108 mc_fatal
("MessageIdTypedef expects an identifier");
110 | MCMESSAGEIDTYPEDEF
error
112 mc_fatal
("missing '=' for MessageIdTypedef");
118 | severitymaps severitymap
119 |
error { mc_fatal
("severity ident missing"); }
123 token
'=' MCNUMBER alias_name
125 mc_add_keyword
($1, MCTOKEN
, "severity", $3, $4);
127 | token
'=' error { mc_fatal
("severity number missing"); }
128 | token
error { mc_fatal
("severity missing '='"); }
133 | facilitymaps facilitymap
134 |
error { mc_fatal
("missing ident in FacilityNames"); }
138 token
'=' MCNUMBER alias_name
140 mc_add_keyword
($1, MCTOKEN
, "facility", $3, $4);
142 | token
'=' error { mc_fatal
("facility number missing"); }
143 | token
error { mc_fatal
("facility missing '='"); }
149 |
error { mc_fatal
("missing ident in LanguageNames"); }
153 token
'=' MCNUMBER lex_want_filename
':' MCFILENAME
155 mc_add_keyword
($1, MCTOKEN
, "language", $3, $6);
157 | token
'=' MCNUMBER lex_want_filename
':' error { mc_fatal
("missing filename in LanguageNames"); }
158 | token
'=' MCNUMBER
error { mc_fatal
("missing ':' in LanguageNames"); }
159 | token
'=' error { mc_fatal
("missing language code in LanguageNames"); }
160 | token
error { mc_fatal
("missing '=' for LanguageNames"); }
172 |
':' error { mc_fatal
("illegal token in identifier"); $$
= NULL
; }
178 cur_node
= mc_add_node
();
179 cur_node
->symbol
= mc_last_symbol
;
180 cur_node
->facility
= mc_cur_facility
;
181 cur_node
->severity
= mc_cur_severity
;
182 cur_node
->id
= ($1 & 0xffffUL
);
183 cur_node
->vid
= ($1 & 0xffffUL
) | mc_sefa_val
;
184 cur_node
->id_typecast
= mcset_msg_id_typedef
;
190 id: MCMESSAGEID
'=' vid
{ $$
= $3; }
191 | MCMESSAGEID
'=' error { mc_fatal
("missing number in MessageId"); $$
= 0; }
192 | MCMESSAGEID
error { mc_fatal
("missing '=' for MessageId"); $$
= 0; }
205 $$
= mc_last_id
+ $2;
207 |
'+' error { mc_fatal
("missing number after MessageId '+'"); }
214 mc_sefa_val
= (mcset_custom_bit ?
1 : 0) << 29;
215 mc_last_symbol
= NULL
;
216 mc_cur_severity
= NULL
;
217 mc_cur_facility
= NULL
;
219 | sefasy_def severity
222 mc_warn
(_
("duplicate definition of Severity"));
225 | sefasy_def facility
228 mc_warn
(_
("duplicate definition of Facility"));
234 mc_warn
(_
("duplicate definition of SymbolicName"));
239 severity: MCSEVERITY
'=' MCTOKEN
241 mc_sefa_val
&= ~
(0x3UL
<< 30);
242 mc_sefa_val |
= (($3->nval
& 0x3UL
) << 30);
243 mc_cur_severity
= $3;
247 facility: MCFACILITY
'=' MCTOKEN
249 mc_sefa_val
&= ~
(0xfffUL
<< 16);
250 mc_sefa_val |
= (($3->nval
& 0xfffUL
) << 16);
251 mc_cur_facility
= $3;
255 symbol: MCSYMBOLICNAME
'=' MCIDENT
263 | lang_entities lang_entity
267 lang lex_want_line lines MCENDLINE
270 h
= mc_add_node_lang
(cur_node
, $1, cur_node
->vid
);
272 if
(mcset_max_message_length
!= 0 && unichar_len
(h
->message
) > mcset_max_message_length
)
273 mc_warn
("message length to long");
285 l1
= unichar_len
($1);
286 l2
= unichar_len
($2);
287 h
= (unichar
*) res_alloc
((l1
+ l2
+ 1) * sizeof
(unichar
));
288 if
(l1
) memcpy
(h
, $1, l1
* sizeof
(unichar
));
289 if
(l2
) memcpy
(&h
[l1
], $2, l2
* sizeof
(unichar
));
293 |
error { mc_fatal
("missing end of message text"); $$
= NULL
; }
294 | lines
error { mc_fatal
("missing end of message text"); $$
= $1; }
297 comments: MCCOMMENT
{ $$
= $1; }
302 l1
= unichar_len
($1);
303 l2
= unichar_len
($2);
304 h
= (unichar
*) res_alloc
((l1
+ l2
+ 1) * sizeof
(unichar
));
305 if
(l1
) memcpy
(h
, $1, l1
* sizeof
(unichar
));
306 if
(l2
) memcpy
(&h
[l1
], $2, l2
* sizeof
(unichar
));
312 lang: MCLANGUAGE lex_want_nl
'=' MCTOKEN NL
316 | MCLANGUAGE lex_want_nl
'=' MCIDENT NL
319 mc_fatal
(_
("undeclared language identifier"));
321 | MCLANGUAGE lex_want_nl
'=' token
error
324 mc_fatal
("missing newline after Language");
326 | MCLANGUAGE lex_want_nl
'=' error
329 mc_fatal
("missing ident for Language");
334 mc_fatal
("missing '=' for Language");
338 token: MCIDENT
{ $$
= $1; }
339 | MCTOKEN
{ $$
= $1->usz
; }
343 /* Empty */ { mclex_want_nl
= 1; }
347 /* Empty */ { mclex_want_line
= 1; }
351 /* Empty */ { mclex_want_filename
= 1; }
356 /* Something else. */