Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / osf / wml / wmlparse.y
1 /* 
2  *  @OSF_COPYRIGHT@
3  *  COPYRIGHT NOTICE
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.
7 */ 
8 /* 
9  * HISTORY
10 */ 
11 /* "$TOG: wmlparse.y /main/10 1997/04/14 12:56:03 dbl $" */
12 /*
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.
16  */
17
18
19 %{
20
21 #include "wml.h"
22
23 #if defined(__STDC__)
24 #include <string.h>             /* for strcpy() */
25 #endif
26
27 #ifndef XmConst
28 #if (defined(__STDC__) && __STDC__)  ||  !defined( NO_CONST )
29 #define XmConst const
30 #else
31 #define XmConst
32 #endif /* __STDC__ */
33 #endif /* XmConst */
34
35 /*
36  * Undefine NULL, since it is defined in stdio
37  */
38 #undef NULL
39
40 %}
41
42
43 /*
44  * Tokens defining terminals of the language
45  */
46
47 /*
48  * token 0 is EOF, not defined here
49  */
50
51 /*
52  * WML statements
53  */
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 */
62 /*
63  * Statement attributes
64  */
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 */
88 /*
89  * Other keywords
90  */
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 */
105
106
107 /*
108  * Special characters
109  */
110 %token  COLON                   43
111 %token  SEMICOLON               44
112 %token  EQUALS                  45
113 %token  LBRACE                  46
114 %token  RBRACE                  47
115
116 /*
117  * non-terminals
118  */
119 %token  STRING                  48      /* Any user literal */
120
121 /*
122  * Others
123  */
124 %token  ERRORTOKEN              49      /* Any unrecognized character */
125
126
127 %start statement_block_list
128
129 %%
130
131 \f
132 /*
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.
136  */
137
138 /*
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.
141  */
142
143 statement_block_list
144         : /* empty */
145         | statement_block_list statement_block
146         ;
147
148 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
158         ;
159
160
161 /*
162  * Statement blocks. Each statement block begins with its identifying
163  * keyword, then includes an arbitrary number of statements
164  */
165 class_statement_block
166         : CLASS
167             class_statement_list
168             ;
169
170 class_statement_list
171         : class_statement SEMICOLON
172         | class_statement_list class_statement SEMICOLON
173         | error { LexIssueError(SEMICOLON); } SEMICOLON
174         ;
175
176 resource_statement_block
177         : RESOURCE
178             resource_statement_list
179             ;
180
181 resource_statement_list
182         : resource_statement SEMICOLON
183         | resource_statement_list resource_statement SEMICOLON
184         | error { LexIssueError(SEMICOLON); } SEMICOLON
185         ;
186
187 child_statement_block
188         : CHILD
189             child_statement_list
190             ;
191
192 child_statement_list
193         : child_statement SEMICOLON
194         | child_statement_list child_statement SEMICOLON
195         | error { LexIssueError(SEMICOLON); } SEMICOLON
196         ;
197
198 datatype_statement_block
199         : DATATYPE
200             datatype_statement_list
201             ;
202
203 datatype_statement_list
204         : datatype_statement SEMICOLON
205         | datatype_statement_list datatype_statement SEMICOLON
206         | error { LexIssueError(SEMICOLON); } SEMICOLON
207         ;
208
209 ctrlist_statement_block
210         : CONTROLLIST
211             ctrlist_statement_list
212             ;
213
214 ctrlist_statement_list
215         : ctrlist_statement SEMICOLON
216         | ctrlist_statement_list ctrlist_statement SEMICOLON
217         | error { LexIssueError(SEMICOLON); } SEMICOLON
218         ;
219
220 enumset_statement_block
221         : ENUMERATIONSET
222             enumset_statement_list
223             ;
224
225 enumset_statement_list
226         : enumset_statement SEMICOLON
227         | enumset_statement_list enumset_statement SEMICOLON
228         | error { LexIssueError(SEMICOLON); } SEMICOLON
229         ;
230
231 enumval_statement_block
232         : ENUMERATIONVALUE
233             enumval_statement_list
234             ;
235
236 enumval_statement_list
237         : enumval_statement SEMICOLON
238         | enumval_statement_list enumval_statement SEMICOLON
239         | error { LexIssueError(SEMICOLON); } SEMICOLON
240         ;
241
242 charset_statement_block
243         : CHARACTERSET
244             charset_statement_list
245             ;
246
247 charset_statement_list
248         : charset_statement SEMICOLON
249         | charset_statement_list charset_statement SEMICOLON
250         | error { LexIssueError(SEMICOLON); } SEMICOLON
251         ;
252
253
254 \f
255 /*
256  * The CLASS statement
257  */
258 class_statement
259         : name
260             COLON
261             class_type
262                 { wmlCreateClass (yynameval, yytknval1); }
263             class_definition
264         ;
265
266 class_type
267         : METACLASS             { yytknval1 = METACLASS; }
268         | WIDGET                { yytknval1 = WIDGET; }
269         | GADGET                { yytknval1 = GADGET; }
270         ;
271
272 class_definition
273         : /* empty */
274         | LBRACE RBRACE
275         | LBRACE class_attribute_list RBRACE
276         | error { LexIssueError(RBRACE); } RBRACE
277         ;
278
279 class_attribute_list
280         : class_attribute
281         | class_attribute_list class_attribute
282         ;
283
284 class_attribute
285         : class_attribute_name
286             EQUALS
287             STRING
288                 { wmlAddClassAttribute (yytknval1, yystringval); }
289             SEMICOLON
290         | boolean_class_attribute_name
291             EQUALS
292             boolean_attribute_value
293                 { wmlAddClassAttribute (yytknval1, yytknval2); }
294             SEMICOLON
295         | class_resources SEMICOLON
296         | class_controls SEMICOLON
297         | class_children SEMICOLON
298         | error { LexIssueError(SEMICOLON); } SEMICOLON
299         ;
300
301 class_attribute_name
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; }
309         ;
310
311 boolean_class_attribute_name
312         : DIALOGCLASS           { yytknval1 = DIALOGCLASS; }
313
314 boolean_attribute_value
315         : ATTRTRUE              { yytknval2 = ATTRTRUE; }
316         | ATTRFALSE             { yytknval2 = ATTRFALSE; }
317         ;
318
319 class_resources
320         : RESOURCES class_resources_block
321         ;
322
323 class_resources_block
324         : /* empty */
325         | LBRACE RBRACE
326         | LBRACE class_resource_list RBRACE
327         | error { LexIssueError(RBRACE); } RBRACE
328         ;
329
330 class_resource_list
331         : class_resource_element
332         | class_resource_list class_resource_element
333         ;
334
335 class_resource_element
336         : name
337                 { wmlAddClassResource (yynameval); }
338             class_resource_attributes
339             SEMICOLON
340         | error { LexIssueError(SEMICOLON); } SEMICOLON
341         ;
342
343 class_resource_attributes
344         : /* empty */
345         | LBRACE RBRACE
346         | LBRACE class_resource_attribute_list RBRACE
347         | error { LexIssueError(RBRACE); } RBRACE
348         ;
349
350 class_resource_attribute_list
351         : class_resource_attribute_element
352         | class_resource_attribute_list class_resource_attribute_element
353         ;
354
355 class_resource_attribute_element
356         : class_resource_attribute_name
357             EQUALS
358             STRING
359                 { wmlAddClassResourceAttribute (yytknval1, yystringval); }
360             SEMICOLON
361         | boolean_class_resource_attribute_name
362             EQUALS
363             boolean_attribute_value
364                 { wmlAddClassResourceAttribute (yytknval1, yytknval2); }
365             SEMICOLON
366         | error { LexIssueError(SEMICOLON); } SEMICOLON
367         ;
368
369 class_resource_attribute_name
370         : TYPE                  { yytknval1 = TYPE; }
371         | DEFAULT               { yytknval1 = DEFAULT; }
372         ;
373
374 boolean_class_resource_attribute_name
375         : EXCLUDE               { yytknval1 = EXCLUDE; }
376         ;
377
378 class_controls
379         : CONTROLS class_controls_block
380         ;
381
382 class_controls_block
383         : /* empty */
384         | LBRACE RBRACE
385         | LBRACE class_controls_list RBRACE
386         | error { LexIssueError(RBRACE); } RBRACE
387         ;
388
389 class_controls_list
390         : class_controls_element
391         | class_controls_list class_controls_element
392         ;
393
394 class_controls_element
395         : name
396                 { wmlAddClassControl (yynameval); }
397             class_controls_attributes
398             SEMICOLON
399         | error { LexIssueError(SEMICOLON); } SEMICOLON
400         ;
401
402 class_controls_attributes
403         : /* empty */
404         | LBRACE RBRACE
405         | error { LexIssueError(RBRACE); } RBRACE
406         ;
407
408 class_children
409         : CHILDREN class_children_block
410         ;
411
412 class_children_block
413         : /* empty */
414         | LBRACE RBRACE
415         | LBRACE class_children_list RBRACE
416         | error { LexIssueError(RBRACE); } RBRACE
417         ;
418
419 class_children_list
420         : class_children_element
421         | class_children_list class_children_element
422         ;
423
424 class_children_element
425         : name
426                 { wmlAddClassChild (yynameval); }
427             SEMICOLON
428         | error { LexIssueError(SEMICOLON); } SEMICOLON
429         ;
430
431
432 \f
433 /*
434  * The RESOURCE statement
435  */
436 resource_statement
437         : name
438             COLON
439             resource_type
440                 { wmlCreateResource (yynameval, yytknval1); }
441             resource_definition
442         ;
443
444 resource_type
445         : ARGUMENT              { yytknval1 = ARGUMENT; }
446         | REASON                { yytknval1 = REASON; }
447         | CONSTRAINT            { yytknval1 = CONSTRAINT; }
448         | SUBRESOURCE           { yytknval1 = SUBRESOURCE; }
449         ;
450
451 resource_definition
452         : /* empty */
453         | LBRACE RBRACE
454         | LBRACE resource_attribute_list RBRACE
455         | error { LexIssueError(RBRACE); } RBRACE
456         ;
457
458 resource_attribute_list
459         : resource_attribute
460         | resource_attribute_list resource_attribute
461         ;
462
463 resource_attribute
464         : resource_attribute_name
465             EQUALS
466             STRING
467                 { wmlAddResourceAttribute (yytknval1, yystringval); }
468             SEMICOLON
469         | boolean_resource_resource_attribute_name
470             EQUALS
471             boolean_attribute_value
472                 { wmlAddResourceAttribute (yytknval1, yytknval2); }
473             SEMICOLON
474         | error { LexIssueError(SEMICOLON); } SEMICOLON
475         ;
476
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; }
486         ;
487
488 boolean_resource_resource_attribute_name
489         : XRMRESOURCE           { yytknval1 = XRMRESOURCE; }
490         ;
491
492 \f
493 /*
494  * The CHILD statement
495  */
496 child_statement
497        : name COLON STRING
498           { wmlCreateChild(yynameval, yystringval); }
499        ;
500   
501 \f
502 /*
503  * DATATYPE statement
504  */
505 datatype_statement
506         : name
507                 { wmlCreateDatatype (yystringval); }
508             datatype_definition
509             ;
510
511 datatype_definition
512         : /* empty */
513         | LBRACE RBRACE
514         | LBRACE datatype_attribute_list RBRACE
515         | error { LexIssueError(RBRACE); } RBRACE
516         ;
517
518 datatype_attribute_list
519         : datatype_attribute
520         | datatype_attribute_list datatype_attribute
521         ;
522
523 datatype_attribute
524         : datatype_attribute_name
525             EQUALS
526             STRING
527                 { wmlAddDatatypeAttribute (yytknval1, yystringval); }
528             SEMICOLON
529         | error { LexIssueError(SEMICOLON); } SEMICOLON
530         ;
531
532 datatype_attribute_name
533         : INTERNALLITERAL       { yytknval1 = INTERNALLITERAL; }
534         | DOCNAME               { yytknval1 = DOCNAME; }
535         | XRMRESOURCE           { yytknval1 = XRMRESOURCE; }
536         ;
537
538
539 \f
540 /*
541  * The CONTROLLIST statement
542  */
543 ctrlist_statement
544         : name
545                 { wmlCreateOrAppendCtrlList (yynameval); }
546             ctrlist_definition
547         ;
548
549 ctrlist_definition
550         : /* empty */
551         | LBRACE RBRACE
552         | LBRACE ctrlist_controls_list RBRACE
553         | error { LexIssueError(RBRACE); } RBRACE
554         ;
555
556 ctrlist_controls_list
557         : ctrlist_control
558         | ctrlist_controls_list ctrlist_control
559         ;
560
561 ctrlist_control
562         : name
563                 { wmlAddCtrlListControl (yynameval); }
564             ctrlist_controls_attributes
565             SEMICOLON
566         | error { LexIssueError(SEMICOLON); } SEMICOLON
567         ;
568
569 ctrlist_controls_attributes
570         : /* empty */
571         | LBRACE RBRACE
572         | error { LexIssueError(RBRACE); } RBRACE
573         ;
574
575
576 \f
577 /*
578  * The ENUMERATIONSET statement
579  */
580 enumset_statement
581         : name
582             COLON
583             enumset_data_type
584                 { wmlCreateEnumSet (yynameval, yystringval); }
585             enumset_definition
586         ;
587
588 enumset_data_type
589         :
590         STRING
591         ;
592
593 enumset_definition
594         : /* empty */
595         | LBRACE RBRACE
596         | LBRACE enumset_value_list RBRACE
597         | error { LexIssueError(RBRACE); } RBRACE
598         ;
599
600 enumset_value_list
601         : enumset_value
602         | enumset_value_list enumset_value
603         ;
604
605 enumset_value
606         : name
607             { wmlAddEnumSetValue (yynameval); }
608             SEMICOLON
609         | error { LexIssueError(SEMICOLON); } SEMICOLON
610         ;
611
612
613 \f
614 /*
615  * The ENUMERATIONVALUE statement
616  */
617 enumval_statement
618         : name
619             COLON    
620                 { wmlCreateEnumValue (yynameval); }
621             enumvalue_definition
622         ;
623
624 enumvalue_definition
625         : /* empty */
626         | LBRACE RBRACE
627         | LBRACE enumvalue_attributes_list RBRACE
628         | error { LexIssueError(RBRACE); } RBRACE
629         ;
630
631 enumvalue_attributes_list
632         : enumvalue_attribute
633         | enumvalue_attributes_list enumvalue_attribute
634         ;
635
636 enumvalue_attribute
637         : enumvalue_attribute_name
638             EQUALS
639             STRING
640                 { wmlAddEnumValueAttribute (yytknval1, yystringval); }
641             SEMICOLON
642         | error { LexIssueError(SEMICOLON); } SEMICOLON
643         ;
644
645 enumvalue_attribute_name
646         : ENUMLITERAL           { yytknval1 = ENUMLITERAL; }
647         ;
648
649
650 \f
651 /*
652  * CHARACTERSET statement
653  */
654 charset_statement
655         : name
656                 { wmlCreateCharset (yystringval); }
657             charset_definition
658             ;
659
660 charset_definition
661         : /* empty */
662         | LBRACE RBRACE
663         | LBRACE charset_attribute_list RBRACE
664         | error { LexIssueError(RBRACE); } RBRACE
665         ;
666
667 charset_attribute_list
668         : charset_attribute
669         | charset_attribute_list charset_attribute
670         ;
671
672 charset_attribute
673         : charset_attribute_name
674             EQUALS
675             STRING
676                 { wmlAddCharsetAttribute (yytknval1, yystringval); }
677             SEMICOLON
678         | predefined_charset_attribute_name
679             EQUALS
680             predefined_charset_attribute_value
681                 { wmlAddCharsetAttribute (yytknval1, yytknval2); }
682             SEMICOLON
683         | error { LexIssueError(SEMICOLON); } SEMICOLON
684         ;
685
686 charset_attribute_name
687         : INTERNALLITERAL       { yytknval1 = INTERNALLITERAL; }
688         | ALIAS                 { yytknval1 = ALIAS; }
689         | XMSTRINGCHARSETNAME   { yytknval1 = XMSTRINGCHARSETNAME; }
690         ;
691
692 predefined_charset_attribute_name
693         : DIRECTION             { yytknval1 = DIRECTION; }
694         | PARSEDIRECTION        { yytknval1 = PARSEDIRECTION; }
695         | CHARACTERSIZE         { yytknval1 = CHARACTERSIZE; }
696         ;
697
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; }
704
705
706 \f
707 /*
708  * Other productions
709  */
710 name
711         : STRING
712                 { strcpy (yynameval, (XmConst char *)yystringval); }
713         ;
714
715 %%
716
717 /*
718  * Dummmy error routine, since we output our own.
719  */
720 int yyerror (s)
721 char *s;
722 {
723         return 0;
724 }
725
726
727 #include "wmllex.c"
728