4 * Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
5 * ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
6 * the full copyright text.
11 /* "$TOG: wmlparse.y /main/10 1997/04/14 12:56:03 dbl $" */
13 * This file defines the grammar for the Motif Widget Meta Language (WML),
14 * the declarative language which describes the widget, gadgets, and
15 * resources in the UIL language.
24 #include <string.h> /* for strcpy() */
28 #if (defined(__STDC__) && __STDC__) || !defined( NO_CONST )
36 * Undefine NULL, since it is defined in stdio
44 * Tokens defining terminals of the language
48 * token 0 is EOF, not defined here
54 %token CLASS 1 /* CLASS statement */
55 %token RESOURCE 2 /* RESOURCE statement */
56 %token DATATYPE 3 /* DATATYPE statement */
57 %token CONTROLLIST 4 /* CONTROLLIST statement */
58 %token ENUMERATIONSET 5 /* ENUMERATIONSET statement */
59 %token ENUMERATIONVALUE 6 /* ENUMERATIONVALUE statement */
60 %token CHARACTERSET 7 /* CHARACTERSET statement */
61 %token CHILD 50 /* CHILD statement */
63 * Statement attributes
65 %token DOCNAME 8 /* DOCNAME attribute */
66 %token CONVFUNC 9 /* CONVENIENCEFUNCTION attribute */
67 %token ALIAS 10 /* ALIAS attribute */
68 %token TYPE 11 /* TYPE attribute */
69 %token RESOURCELITERAL 12 /* RESOURCELITERAL attribute */
70 %token RELATED 13 /* RELATED attribute */
71 %token INTERNALLITERAL 14 /* INTERNALLITERAL attribute */
72 %token XRMRESOURCE 15 /* XRMRESOURCE attribute */
73 %token EXCLUDE 16 /* EXCLUDE attribute */
74 %token RESOURCES 17 /* RESOURCES attribute */
75 %token SUPERCLASS 18 /* SUPERCLASS attribute */
76 %token CONTROLS 19 /* CONTROLS attribute */
77 %token WIDGETCLASS 20 /* WIDGETCLASS attribute */
78 %token DIALOGCLASS 21 /* DIALOGCLASS attribute */
79 %token DEFAULT 22 /* DEFAULT attribute */
80 %token ENUMLITERAL 23 /* ENUMLITERAL attribute */
81 %token XMSTRINGCHARSETNAME 24 /* XMSTRINGCHARSETNAME attribute */
82 %token DIRECTION 25 /* DIRECTION attribute */
83 %token PARSEDIRECTION 26 /* PARSEDIRECTION attribute */
84 %token CHARACTERSIZE 27 /* CHARACTERSIZE attribute */
85 %token CTRLMAPSRESOURCE 28 /* CTRLMAPSRESOURCE attribute */
86 %token CHILDREN 51 /* CHILDREN attribute */
87 %token PARENTCLASS 52 /* PARENTCLASS attribute */
91 %token METACLASS 29 /* CLASS type */
92 %token WIDGET 30 /* CLASS type */
93 %token GADGET 31 /* CLASS type */
94 %token ARGUMENT 32 /* RESOURCE type */
95 %token REASON 33 /* RESOURCE type */
96 %token CONSTRAINT 34 /* RESOURCE type */
97 %token SUBRESOURCE 35 /* RESOURCE type */
98 %token ATTRTRUE 36 /* attribute value */
99 %token ATTRFALSE 37 /* attribute value */
100 %token LEFTTORIGHT 38 /* DIRECTION attribute */
101 %token RIGHTTOLEFT 39 /* DIRECTION attribute */
102 %token ONEBYTE 40 /* CHARACTERSIZE attribute */
103 %token TWOBYTE 41 /* CHARACTERSIZE attribute */
104 %token MIXED1_2BYTE 42 /* CHARACTERSIZE attribute */
119 %token STRING 48 /* Any user literal */
124 %token ERRORTOKEN 49 /* Any unrecognized character */
127 %start statement_block_list
133 * Productions of the WML grammar. All routines assume that current
134 * data structures are kept in globals. This works as the language has
135 * no recursive elements.
139 * The language consists of blocks of statements. The blocks may occur
140 * in any order, and blocks of the same kind may be arbitrarily repeated.
145 | statement_block_list statement_block
149 : class_statement_block
150 | resource_statement_block
151 | child_statement_block
152 | datatype_statement_block
153 | ctrlist_statement_block
154 | enumset_statement_block
155 | enumval_statement_block
156 | charset_statement_block
157 | error { LexIssueError(0); } SEMICOLON
162 * Statement blocks. Each statement block begins with its identifying
163 * keyword, then includes an arbitrary number of statements
165 class_statement_block
171 : class_statement SEMICOLON
172 | class_statement_list class_statement SEMICOLON
173 | error { LexIssueError(SEMICOLON); } SEMICOLON
176 resource_statement_block
178 resource_statement_list
181 resource_statement_list
182 : resource_statement SEMICOLON
183 | resource_statement_list resource_statement SEMICOLON
184 | error { LexIssueError(SEMICOLON); } SEMICOLON
187 child_statement_block
193 : child_statement SEMICOLON
194 | child_statement_list child_statement SEMICOLON
195 | error { LexIssueError(SEMICOLON); } SEMICOLON
198 datatype_statement_block
200 datatype_statement_list
203 datatype_statement_list
204 : datatype_statement SEMICOLON
205 | datatype_statement_list datatype_statement SEMICOLON
206 | error { LexIssueError(SEMICOLON); } SEMICOLON
209 ctrlist_statement_block
211 ctrlist_statement_list
214 ctrlist_statement_list
215 : ctrlist_statement SEMICOLON
216 | ctrlist_statement_list ctrlist_statement SEMICOLON
217 | error { LexIssueError(SEMICOLON); } SEMICOLON
220 enumset_statement_block
222 enumset_statement_list
225 enumset_statement_list
226 : enumset_statement SEMICOLON
227 | enumset_statement_list enumset_statement SEMICOLON
228 | error { LexIssueError(SEMICOLON); } SEMICOLON
231 enumval_statement_block
233 enumval_statement_list
236 enumval_statement_list
237 : enumval_statement SEMICOLON
238 | enumval_statement_list enumval_statement SEMICOLON
239 | error { LexIssueError(SEMICOLON); } SEMICOLON
242 charset_statement_block
244 charset_statement_list
247 charset_statement_list
248 : charset_statement SEMICOLON
249 | charset_statement_list charset_statement SEMICOLON
250 | error { LexIssueError(SEMICOLON); } SEMICOLON
256 * The CLASS statement
262 { wmlCreateClass (yynameval, yytknval1); }
267 : METACLASS { yytknval1 = METACLASS; }
268 | WIDGET { yytknval1 = WIDGET; }
269 | GADGET { yytknval1 = GADGET; }
275 | LBRACE class_attribute_list RBRACE
276 | error { LexIssueError(RBRACE); } RBRACE
281 | class_attribute_list class_attribute
285 : class_attribute_name
288 { wmlAddClassAttribute (yytknval1, yystringval); }
290 | boolean_class_attribute_name
292 boolean_attribute_value
293 { wmlAddClassAttribute (yytknval1, yytknval2); }
295 | class_resources SEMICOLON
296 | class_controls SEMICOLON
297 | class_children SEMICOLON
298 | error { LexIssueError(SEMICOLON); } SEMICOLON
302 : SUPERCLASS { yytknval1 = SUPERCLASS; }
303 | PARENTCLASS { yytknval1 = PARENTCLASS; }
304 | INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
305 | DOCNAME { yytknval1 = DOCNAME; }
306 | CONVFUNC { yytknval1 = CONVFUNC; }
307 | WIDGETCLASS { yytknval1 = WIDGETCLASS; }
308 | CTRLMAPSRESOURCE { yytknval1 = CTRLMAPSRESOURCE; }
311 boolean_class_attribute_name
312 : DIALOGCLASS { yytknval1 = DIALOGCLASS; }
314 boolean_attribute_value
315 : ATTRTRUE { yytknval2 = ATTRTRUE; }
316 | ATTRFALSE { yytknval2 = ATTRFALSE; }
320 : RESOURCES class_resources_block
323 class_resources_block
326 | LBRACE class_resource_list RBRACE
327 | error { LexIssueError(RBRACE); } RBRACE
331 : class_resource_element
332 | class_resource_list class_resource_element
335 class_resource_element
337 { wmlAddClassResource (yynameval); }
338 class_resource_attributes
340 | error { LexIssueError(SEMICOLON); } SEMICOLON
343 class_resource_attributes
346 | LBRACE class_resource_attribute_list RBRACE
347 | error { LexIssueError(RBRACE); } RBRACE
350 class_resource_attribute_list
351 : class_resource_attribute_element
352 | class_resource_attribute_list class_resource_attribute_element
355 class_resource_attribute_element
356 : class_resource_attribute_name
359 { wmlAddClassResourceAttribute (yytknval1, yystringval); }
361 | boolean_class_resource_attribute_name
363 boolean_attribute_value
364 { wmlAddClassResourceAttribute (yytknval1, yytknval2); }
366 | error { LexIssueError(SEMICOLON); } SEMICOLON
369 class_resource_attribute_name
370 : TYPE { yytknval1 = TYPE; }
371 | DEFAULT { yytknval1 = DEFAULT; }
374 boolean_class_resource_attribute_name
375 : EXCLUDE { yytknval1 = EXCLUDE; }
379 : CONTROLS class_controls_block
385 | LBRACE class_controls_list RBRACE
386 | error { LexIssueError(RBRACE); } RBRACE
390 : class_controls_element
391 | class_controls_list class_controls_element
394 class_controls_element
396 { wmlAddClassControl (yynameval); }
397 class_controls_attributes
399 | error { LexIssueError(SEMICOLON); } SEMICOLON
402 class_controls_attributes
405 | error { LexIssueError(RBRACE); } RBRACE
409 : CHILDREN class_children_block
415 | LBRACE class_children_list RBRACE
416 | error { LexIssueError(RBRACE); } RBRACE
420 : class_children_element
421 | class_children_list class_children_element
424 class_children_element
426 { wmlAddClassChild (yynameval); }
428 | error { LexIssueError(SEMICOLON); } SEMICOLON
434 * The RESOURCE statement
440 { wmlCreateResource (yynameval, yytknval1); }
445 : ARGUMENT { yytknval1 = ARGUMENT; }
446 | REASON { yytknval1 = REASON; }
447 | CONSTRAINT { yytknval1 = CONSTRAINT; }
448 | SUBRESOURCE { yytknval1 = SUBRESOURCE; }
454 | LBRACE resource_attribute_list RBRACE
455 | error { LexIssueError(RBRACE); } RBRACE
458 resource_attribute_list
460 | resource_attribute_list resource_attribute
464 : resource_attribute_name
467 { wmlAddResourceAttribute (yytknval1, yystringval); }
469 | boolean_resource_resource_attribute_name
471 boolean_attribute_value
472 { wmlAddResourceAttribute (yytknval1, yytknval2); }
474 | error { LexIssueError(SEMICOLON); } SEMICOLON
477 resource_attribute_name
478 : TYPE { yytknval1 = TYPE; }
479 | RESOURCELITERAL { yytknval1 = RESOURCELITERAL; }
480 | ENUMERATIONSET { yytknval1 = ENUMERATIONSET; }
481 | INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
482 | RELATED { yytknval1 = RELATED; }
483 | DOCNAME { yytknval1 = DOCNAME; }
484 | DEFAULT { yytknval1 = DEFAULT; }
485 | ALIAS { yytknval1 = ALIAS; }
488 boolean_resource_resource_attribute_name
489 : XRMRESOURCE { yytknval1 = XRMRESOURCE; }
494 * The CHILD statement
498 { wmlCreateChild(yynameval, yystringval); }
507 { wmlCreateDatatype (yystringval); }
514 | LBRACE datatype_attribute_list RBRACE
515 | error { LexIssueError(RBRACE); } RBRACE
518 datatype_attribute_list
520 | datatype_attribute_list datatype_attribute
524 : datatype_attribute_name
527 { wmlAddDatatypeAttribute (yytknval1, yystringval); }
529 | error { LexIssueError(SEMICOLON); } SEMICOLON
532 datatype_attribute_name
533 : INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
534 | DOCNAME { yytknval1 = DOCNAME; }
535 | XRMRESOURCE { yytknval1 = XRMRESOURCE; }
541 * The CONTROLLIST statement
545 { wmlCreateOrAppendCtrlList (yynameval); }
552 | LBRACE ctrlist_controls_list RBRACE
553 | error { LexIssueError(RBRACE); } RBRACE
556 ctrlist_controls_list
558 | ctrlist_controls_list ctrlist_control
563 { wmlAddCtrlListControl (yynameval); }
564 ctrlist_controls_attributes
566 | error { LexIssueError(SEMICOLON); } SEMICOLON
569 ctrlist_controls_attributes
572 | error { LexIssueError(RBRACE); } RBRACE
578 * The ENUMERATIONSET statement
584 { wmlCreateEnumSet (yynameval, yystringval); }
596 | LBRACE enumset_value_list RBRACE
597 | error { LexIssueError(RBRACE); } RBRACE
602 | enumset_value_list enumset_value
607 { wmlAddEnumSetValue (yynameval); }
609 | error { LexIssueError(SEMICOLON); } SEMICOLON
615 * The ENUMERATIONVALUE statement
620 { wmlCreateEnumValue (yynameval); }
627 | LBRACE enumvalue_attributes_list RBRACE
628 | error { LexIssueError(RBRACE); } RBRACE
631 enumvalue_attributes_list
632 : enumvalue_attribute
633 | enumvalue_attributes_list enumvalue_attribute
637 : enumvalue_attribute_name
640 { wmlAddEnumValueAttribute (yytknval1, yystringval); }
642 | error { LexIssueError(SEMICOLON); } SEMICOLON
645 enumvalue_attribute_name
646 : ENUMLITERAL { yytknval1 = ENUMLITERAL; }
652 * CHARACTERSET statement
656 { wmlCreateCharset (yystringval); }
663 | LBRACE charset_attribute_list RBRACE
664 | error { LexIssueError(RBRACE); } RBRACE
667 charset_attribute_list
669 | charset_attribute_list charset_attribute
673 : charset_attribute_name
676 { wmlAddCharsetAttribute (yytknval1, yystringval); }
678 | predefined_charset_attribute_name
680 predefined_charset_attribute_value
681 { wmlAddCharsetAttribute (yytknval1, yytknval2); }
683 | error { LexIssueError(SEMICOLON); } SEMICOLON
686 charset_attribute_name
687 : INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
688 | ALIAS { yytknval1 = ALIAS; }
689 | XMSTRINGCHARSETNAME { yytknval1 = XMSTRINGCHARSETNAME; }
692 predefined_charset_attribute_name
693 : DIRECTION { yytknval1 = DIRECTION; }
694 | PARSEDIRECTION { yytknval1 = PARSEDIRECTION; }
695 | CHARACTERSIZE { yytknval1 = CHARACTERSIZE; }
698 predefined_charset_attribute_value
699 : LEFTTORIGHT { yytknval2 = LEFTTORIGHT; }
700 | RIGHTTOLEFT { yytknval2 = RIGHTTOLEFT; }
701 | ONEBYTE { yytknval2 = ONEBYTE; }
702 | TWOBYTE { yytknval2 = TWOBYTE; }
703 | MIXED1_2BYTE { yytknval2 = MIXED1_2BYTE; }
712 { strcpy (yynameval, (XmConst char *)yystringval); }
718 * Dummmy error routine, since we output our own.