1 %
{ /* mcparse.y -- parser for Windows mc files
2 Copyright (C) 2007-2019 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
;
189 id: MCMESSAGEID
'=' vid
{ $$
= $3; }
190 | MCMESSAGEID
'=' error { mc_fatal
("missing number in MessageId"); $$
= 0; }
191 | MCMESSAGEID
error { mc_fatal
("missing '=' for MessageId"); $$
= 0; }
204 $$
= mc_last_id
+ $2;
206 |
'+' error { mc_fatal
("missing number after MessageId '+'"); }
213 mc_sefa_val
= (mcset_custom_bit ?
1 : 0) << 29;
214 mc_last_symbol
= NULL
;
215 mc_cur_severity
= NULL
;
216 mc_cur_facility
= NULL
;
218 | sefasy_def severity
221 mc_warn
(_
("duplicate definition of Severity"));
224 | sefasy_def facility
227 mc_warn
(_
("duplicate definition of Facility"));
233 mc_warn
(_
("duplicate definition of SymbolicName"));
238 severity: MCSEVERITY
'=' MCTOKEN
240 mc_sefa_val
&= ~
(0x3UL
<< 30);
241 mc_sefa_val |
= (($3->nval
& 0x3UL
) << 30);
242 mc_cur_severity
= $3;
246 facility: MCFACILITY
'=' MCTOKEN
248 mc_sefa_val
&= ~
(0xfffUL
<< 16);
249 mc_sefa_val |
= (($3->nval
& 0xfffUL
) << 16);
250 mc_cur_facility
= $3;
254 symbol: MCSYMBOLICNAME
'=' MCIDENT
262 | lang_entities lang_entity
266 lang lex_want_line lines MCENDLINE
269 h
= mc_add_node_lang
(cur_node
, $1, cur_node
->vid
);
271 if
(mcset_max_message_length
!= 0 && unichar_len
(h
->message
) > mcset_max_message_length
)
272 mc_warn
("message length to long");
284 l1
= unichar_len
($1);
285 l2
= unichar_len
($2);
286 h
= (unichar
*) res_alloc
((l1
+ l2
+ 1) * sizeof
(unichar
));
287 if
(l1
) memcpy
(h
, $1, l1
* sizeof
(unichar
));
288 if
(l2
) memcpy
(&h
[l1
], $2, l2
* sizeof
(unichar
));
292 |
error { mc_fatal
("missing end of message text"); $$
= NULL
; }
293 | lines
error { mc_fatal
("missing end of message text"); $$
= $1; }
296 comments: MCCOMMENT
{ $$
= $1; }
301 l1
= unichar_len
($1);
302 l2
= unichar_len
($2);
303 h
= (unichar
*) res_alloc
((l1
+ l2
+ 1) * sizeof
(unichar
));
304 if
(l1
) memcpy
(h
, $1, l1
* sizeof
(unichar
));
305 if
(l2
) memcpy
(&h
[l1
], $2, l2
* sizeof
(unichar
));
311 lang: MCLANGUAGE lex_want_nl
'=' MCTOKEN NL
315 | MCLANGUAGE lex_want_nl
'=' MCIDENT NL
318 mc_fatal
(_
("undeclared language identifier"));
320 | MCLANGUAGE lex_want_nl
'=' token
error
323 mc_fatal
("missing newline after Language");
325 | MCLANGUAGE lex_want_nl
'=' error
328 mc_fatal
("missing ident for Language");
333 mc_fatal
("missing '=' for Language");
337 token: MCIDENT
{ $$
= $1; }
338 | MCTOKEN
{ $$
= $1->usz
; }
342 /* Empty */ { mclex_want_nl
= 1; }
346 /* Empty */ { mclex_want_line
= 1; }
350 /* Empty */ { mclex_want_filename
= 1; }
355 /* Something else. */