xkbparse.y revision f46a6179
1f46a6179Smrg/* $Xorg: xkbparse.y,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */
2f46a6179Smrg/************************************************************
3f46a6179Smrg Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
4f46a6179Smrg
5f46a6179Smrg Permission to use, copy, modify, and distribute this
6f46a6179Smrg software and its documentation for any purpose and without
7f46a6179Smrg fee is hereby granted, provided that the above copyright
8f46a6179Smrg notice appear in all copies and that both that copyright
9f46a6179Smrg notice and this permission notice appear in supporting
10f46a6179Smrg documentation, and that the name of Silicon Graphics not be
11f46a6179Smrg used in advertising or publicity pertaining to distribution
12f46a6179Smrg of the software without specific prior written permission.
13f46a6179Smrg Silicon Graphics makes no representation about the suitability
14f46a6179Smrg of this software for any purpose. It is provided "as is"
15f46a6179Smrg without any express or implied warranty.
16f46a6179Smrg
17f46a6179Smrg SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
18f46a6179Smrg SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
19f46a6179Smrg AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
20f46a6179Smrg GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
21f46a6179Smrg DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
22f46a6179Smrg DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
23f46a6179Smrg OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
24f46a6179Smrg THE USE OR PERFORMANCE OF THIS SOFTWARE.
25f46a6179Smrg
26f46a6179Smrg ********************************************************/
27f46a6179Smrg/* $XFree86: xc/programs/xkbcomp/xkbparse.y,v 3.11tsi Exp $ */
28f46a6179Smrg
29f46a6179Smrg%token
30f46a6179Smrg	END_OF_FILE	0
31f46a6179Smrg	ERROR_TOK	255
32f46a6179Smrg	XKB_KEYMAP	1
33f46a6179Smrg	XKB_KEYCODES	2
34f46a6179Smrg	XKB_TYPES	3
35f46a6179Smrg	XKB_SYMBOLS	4
36f46a6179Smrg	XKB_COMPATMAP	5
37f46a6179Smrg	XKB_GEOMETRY	6
38f46a6179Smrg	XKB_SEMANTICS	7
39f46a6179Smrg	XKB_LAYOUT	8
40f46a6179Smrg	INCLUDE		10
41f46a6179Smrg	OVERRIDE	11
42f46a6179Smrg	AUGMENT		12
43f46a6179Smrg	REPLACE		13
44f46a6179Smrg	ALTERNATE	14
45f46a6179Smrg	VIRTUAL_MODS	20
46f46a6179Smrg	TYPE		21
47f46a6179Smrg	INTERPRET	22
48f46a6179Smrg	ACTION_TOK	23
49f46a6179Smrg	KEY		24
50f46a6179Smrg	ALIAS		25
51f46a6179Smrg	GROUP		26
52f46a6179Smrg	MODIFIER_MAP	27
53f46a6179Smrg	INDICATOR	28
54f46a6179Smrg	SHAPE		29
55f46a6179Smrg	KEYS		30
56f46a6179Smrg	ROW		31
57f46a6179Smrg	SECTION		32
58f46a6179Smrg	OVERLAY		33
59f46a6179Smrg	TEXT		34
60f46a6179Smrg	OUTLINE		35
61f46a6179Smrg	SOLID		36
62f46a6179Smrg	LOGO		37
63f46a6179Smrg	VIRTUAL		38
64f46a6179Smrg	EQUALS		40
65f46a6179Smrg	PLUS		41
66f46a6179Smrg	MINUS		42
67f46a6179Smrg	DIVIDE		43
68f46a6179Smrg	TIMES		44
69f46a6179Smrg	OBRACE		45
70f46a6179Smrg	CBRACE		46
71f46a6179Smrg	OPAREN		47
72f46a6179Smrg	CPAREN		48
73f46a6179Smrg	OBRACKET	49
74f46a6179Smrg	CBRACKET	50
75f46a6179Smrg	DOT		51
76f46a6179Smrg	COMMA		52
77f46a6179Smrg	SEMI		53
78f46a6179Smrg	EXCLAM		54
79f46a6179Smrg	INVERT		55
80f46a6179Smrg	STRING		60
81f46a6179Smrg	INTEGER		61
82f46a6179Smrg	FLOAT		62
83f46a6179Smrg	IDENT		63
84f46a6179Smrg	KEYNAME		64
85f46a6179Smrg	PARTIAL		70
86f46a6179Smrg	DEFAULT		71
87f46a6179Smrg	HIDDEN		72
88f46a6179Smrg	ALPHANUMERIC_KEYS	73
89f46a6179Smrg	MODIFIER_KEYS		74
90f46a6179Smrg	KEYPAD_KEYS		75
91f46a6179Smrg	FUNCTION_KEYS		76
92f46a6179Smrg	ALTERNATE_GROUP		77
93f46a6179Smrg%{
94f46a6179Smrg#ifdef DEBUG
95f46a6179Smrg#define	YYDEBUG 1
96f46a6179Smrg#endif
97f46a6179Smrg#define	DEBUG_VAR parseDebug
98f46a6179Smrg#include "parseutils.h"
99f46a6179Smrg#include <X11/keysym.h>
100f46a6179Smrg#include <X11/extensions/XKBgeom.h>
101f46a6179Smrg#include <stdlib.h>
102f46a6179Smrg
103f46a6179Smrg
104f46a6179Smrg%}
105f46a6179Smrg%right	EQUALS
106f46a6179Smrg%left	PLUS MINUS
107f46a6179Smrg%left	TIMES DIVIDE
108f46a6179Smrg%left	EXCLAM INVERT
109f46a6179Smrg%left	OPAREN
110f46a6179Smrg%start	XkbFile
111f46a6179Smrg%union	{
112f46a6179Smrg	int		 ival;
113f46a6179Smrg	unsigned	 uval;
114f46a6179Smrg	char		*str;
115f46a6179Smrg	Atom	 	sval;
116f46a6179Smrg	ParseCommon	*any;
117f46a6179Smrg	ExprDef		*expr;
118f46a6179Smrg	VarDef		*var;
119f46a6179Smrg	VModDef		*vmod;
120f46a6179Smrg	InterpDef	*interp;
121f46a6179Smrg	KeyTypeDef	*keyType;
122f46a6179Smrg	SymbolsDef	*syms;
123f46a6179Smrg	ModMapDef	*modMask;
124f46a6179Smrg	GroupCompatDef	*groupCompat;
125f46a6179Smrg	IndicatorMapDef	*ledMap;
126f46a6179Smrg	IndicatorNameDef *ledName;
127f46a6179Smrg	KeycodeDef	*keyName;
128f46a6179Smrg	KeyAliasDef	*keyAlias;
129f46a6179Smrg	ShapeDef	*shape;
130f46a6179Smrg	SectionDef	*section;
131f46a6179Smrg	RowDef		*row;
132f46a6179Smrg	KeyDef		*key;
133f46a6179Smrg	OverlayDef	*overlay;
134f46a6179Smrg	OverlayKeyDef	*olKey;
135f46a6179Smrg	OutlineDef	*outline;
136f46a6179Smrg	DoodadDef	*doodad;
137f46a6179Smrg	XkbFile		*file;
138f46a6179Smrg}
139f46a6179Smrg%type <ival>	Number Integer Float SignedNumber
140f46a6179Smrg%type <uval>	XkbCompositeType FileType MergeMode OptMergeMode KeySym
141f46a6179Smrg%type <uval>	DoodadType Flag Flags OptFlags
142f46a6179Smrg%type <str>	KeyName MapName OptMapName
143f46a6179Smrg%type <sval>	FieldSpec Ident Element String
144f46a6179Smrg%type <any>	DeclList Decl
145f46a6179Smrg%type <expr>	OptExprList ExprList Expr Term Lhs Terminal ArrayInit
146f46a6179Smrg%type <expr>	OptKeySymList KeySymList Action ActionList Coord CoordList
147f46a6179Smrg%type <var>	VarDecl VarDeclList SymbolsBody SymbolsVarDecl
148f46a6179Smrg%type <vmod>	VModDecl VModDefList VModDef
149f46a6179Smrg%type <interp>	InterpretDecl InterpretMatch
150f46a6179Smrg%type <keyType>	KeyTypeDecl
151f46a6179Smrg%type <syms>	SymbolsDecl
152f46a6179Smrg%type <modMask>	ModMapDecl
153f46a6179Smrg%type <groupCompat> GroupCompatDecl
154f46a6179Smrg%type <ledMap>	IndicatorMapDecl
155f46a6179Smrg%type <ledName>	IndicatorNameDecl
156f46a6179Smrg%type <keyName>	KeyNameDecl
157f46a6179Smrg%type <keyAlias> KeyAliasDecl
158f46a6179Smrg%type <shape>	ShapeDecl
159f46a6179Smrg%type <section>	SectionDecl
160f46a6179Smrg%type <row>	SectionBody SectionBodyItem
161f46a6179Smrg%type <key>	RowBody RowBodyItem Keys Key
162f46a6179Smrg%type <overlay>	OverlayDecl
163f46a6179Smrg%type <olKey>	OverlayKeyList OverlayKey
164f46a6179Smrg%type <outline>	OutlineList OutlineInList
165f46a6179Smrg%type <doodad>	DoodadDecl
166f46a6179Smrg%type <file>	XkbFile XkbMapConfigList XkbMapConfig XkbConfig
167f46a6179Smrg%type <file>	XkbCompositeMap XkbCompMapList
168f46a6179Smrg%%
169f46a6179SmrgXkbFile		:	XkbCompMapList
170f46a6179Smrg			{ $$= rtrnValue= $1; }
171f46a6179Smrg		|	XkbMapConfigList
172f46a6179Smrg			{ $$= rtrnValue= $1;  }
173f46a6179Smrg		|	XkbConfig
174f46a6179Smrg			{ $$= rtrnValue= $1; }
175f46a6179Smrg		;
176f46a6179Smrg
177f46a6179SmrgXkbCompMapList	:	XkbCompMapList XkbCompositeMap
178f46a6179Smrg			{ $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); }
179f46a6179Smrg		|	XkbCompositeMap
180f46a6179Smrg			{ $$= $1; }
181f46a6179Smrg		;
182f46a6179Smrg
183f46a6179SmrgXkbCompositeMap	:	OptFlags XkbCompositeType OptMapName OBRACE
184f46a6179Smrg			    XkbMapConfigList
185f46a6179Smrg			CBRACE SEMI
186f46a6179Smrg			{ $$= CreateXKBFile($2,$3,&$5->common,$1); }
187f46a6179Smrg		;
188f46a6179Smrg
189f46a6179SmrgXkbCompositeType:	XKB_KEYMAP	{ $$= XkmKeymapFile; }
190f46a6179Smrg		|	XKB_SEMANTICS	{ $$= XkmSemanticsFile; }
191f46a6179Smrg		|	XKB_LAYOUT	{ $$= XkmLayoutFile; }
192f46a6179Smrg		;
193f46a6179Smrg
194f46a6179SmrgXkbMapConfigList :	XkbMapConfigList XkbMapConfig
195f46a6179Smrg			{ $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); }
196f46a6179Smrg		|	XkbMapConfig
197f46a6179Smrg			{ $$= $1; }
198f46a6179Smrg		;
199f46a6179Smrg
200f46a6179SmrgXkbMapConfig	:	OptFlags FileType OptMapName OBRACE
201f46a6179Smrg			    DeclList
202f46a6179Smrg			CBRACE SEMI
203f46a6179Smrg			{ $$= CreateXKBFile($2,$3,$5,$1); }
204f46a6179Smrg		;
205f46a6179Smrg
206f46a6179SmrgXkbConfig	:	OptFlags FileType OptMapName DeclList
207f46a6179Smrg			{ $$= CreateXKBFile($2,$3,$4,$1); }
208f46a6179Smrg		;
209f46a6179Smrg
210f46a6179Smrg
211f46a6179SmrgFileType	:	XKB_KEYCODES		{ $$= XkmKeyNamesIndex; }
212f46a6179Smrg		|	XKB_TYPES		{ $$= XkmTypesIndex; }
213f46a6179Smrg		|	XKB_COMPATMAP		{ $$= XkmCompatMapIndex; }
214f46a6179Smrg		|	XKB_SYMBOLS		{ $$= XkmSymbolsIndex; }
215f46a6179Smrg		|	XKB_GEOMETRY		{ $$= XkmGeometryIndex; }
216f46a6179Smrg		;
217f46a6179Smrg
218f46a6179SmrgOptFlags	:	Flags			{ $$= $1; }
219f46a6179Smrg		|				{ $$= 0; }
220f46a6179Smrg		;
221f46a6179Smrg
222f46a6179SmrgFlags		:	Flags Flag		{ $$= (($1)|($2)); }
223f46a6179Smrg		|	Flag			{ $$= $1; }
224f46a6179Smrg		;
225f46a6179Smrg
226f46a6179SmrgFlag		:	PARTIAL			{ $$= XkbLC_Partial; }
227f46a6179Smrg		|	DEFAULT			{ $$= XkbLC_Default; }
228f46a6179Smrg		|	HIDDEN			{ $$= XkbLC_Hidden; }
229f46a6179Smrg		|	ALPHANUMERIC_KEYS	{ $$= XkbLC_AlphanumericKeys; }
230f46a6179Smrg		|	MODIFIER_KEYS		{ $$= XkbLC_ModifierKeys; }
231f46a6179Smrg		|	KEYPAD_KEYS		{ $$= XkbLC_KeypadKeys; }
232f46a6179Smrg		|	FUNCTION_KEYS		{ $$= XkbLC_FunctionKeys; }
233f46a6179Smrg		|	ALTERNATE_GROUP		{ $$= XkbLC_AlternateGroup; }
234f46a6179Smrg		;
235f46a6179Smrg
236f46a6179SmrgDeclList	:	DeclList Decl
237f46a6179Smrg			{ $$= AppendStmt($1,$2); }
238f46a6179Smrg		|	{ $$= NULL; }
239f46a6179Smrg		;
240f46a6179Smrg
241f46a6179SmrgDecl		:	OptMergeMode VarDecl
242f46a6179Smrg			{
243f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
244f46a6179Smrg			    $$= &$2->common;
245f46a6179Smrg			}
246f46a6179Smrg		|	OptMergeMode VModDecl
247f46a6179Smrg			{
248f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
249f46a6179Smrg			    $$= &$2->common;
250f46a6179Smrg			}
251f46a6179Smrg		|	OptMergeMode InterpretDecl
252f46a6179Smrg			{
253f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
254f46a6179Smrg			    $$= &$2->common;
255f46a6179Smrg			}
256f46a6179Smrg		|	OptMergeMode KeyNameDecl
257f46a6179Smrg			{
258f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
259f46a6179Smrg			    $$= &$2->common;
260f46a6179Smrg			}
261f46a6179Smrg		|	OptMergeMode KeyAliasDecl
262f46a6179Smrg			{
263f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
264f46a6179Smrg			    $$= &$2->common;
265f46a6179Smrg			}
266f46a6179Smrg		|	OptMergeMode KeyTypeDecl
267f46a6179Smrg			{
268f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
269f46a6179Smrg			    $$= &$2->common;
270f46a6179Smrg			}
271f46a6179Smrg		|	OptMergeMode SymbolsDecl
272f46a6179Smrg			{
273f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
274f46a6179Smrg			    $$= &$2->common;
275f46a6179Smrg			}
276f46a6179Smrg		|	OptMergeMode ModMapDecl
277f46a6179Smrg			{
278f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
279f46a6179Smrg			    $$= &$2->common;
280f46a6179Smrg			}
281f46a6179Smrg		|	OptMergeMode GroupCompatDecl
282f46a6179Smrg			{
283f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
284f46a6179Smrg			    $$= &$2->common;
285f46a6179Smrg			}
286f46a6179Smrg		|	OptMergeMode IndicatorMapDecl
287f46a6179Smrg			{
288f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
289f46a6179Smrg			    $$= &$2->common;
290f46a6179Smrg			}
291f46a6179Smrg		|	OptMergeMode IndicatorNameDecl
292f46a6179Smrg			{
293f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
294f46a6179Smrg			    $$= &$2->common;
295f46a6179Smrg			}
296f46a6179Smrg		|	OptMergeMode ShapeDecl
297f46a6179Smrg			{
298f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
299f46a6179Smrg			    $$= &$2->common;
300f46a6179Smrg			}
301f46a6179Smrg		|	OptMergeMode SectionDecl
302f46a6179Smrg			{
303f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
304f46a6179Smrg			    $$= &$2->common;
305f46a6179Smrg			}
306f46a6179Smrg		|	OptMergeMode DoodadDecl
307f46a6179Smrg			{
308f46a6179Smrg			    $2->merge= StmtSetMerge(&$2->common,$1);
309f46a6179Smrg			    $$= &$2->common;
310f46a6179Smrg			}
311f46a6179Smrg		|	MergeMode STRING
312f46a6179Smrg			{
313f46a6179Smrg			    if ($1==MergeAltForm) {
314f46a6179Smrg				yyerror("cannot use 'alternate' to include other maps");
315f46a6179Smrg				$$= &IncludeCreate(scanStr,MergeDefault)->common;
316f46a6179Smrg			    }
317f46a6179Smrg			    else {
318f46a6179Smrg				$$= &IncludeCreate(scanStr,$1)->common;
319f46a6179Smrg			    }
320f46a6179Smrg                        }
321f46a6179Smrg		;
322f46a6179Smrg
323f46a6179SmrgVarDecl		:	Lhs EQUALS Expr SEMI
324f46a6179Smrg			{ $$= VarCreate($1,$3); }
325f46a6179Smrg		|	Ident SEMI
326f46a6179Smrg			{ $$= BoolVarCreate($1,1); }
327f46a6179Smrg		|	EXCLAM Ident SEMI
328f46a6179Smrg			{ $$= BoolVarCreate($2,0); }
329f46a6179Smrg		;
330f46a6179Smrg
331f46a6179SmrgKeyNameDecl	:	KeyName EQUALS Expr SEMI
332f46a6179Smrg                        {
333f46a6179Smrg			    KeycodeDef *def;
334f46a6179Smrg
335f46a6179Smrg			    def= KeycodeCreate($1,$3);
336f46a6179Smrg			    if ($1)
337f46a6179Smrg				free($1);
338f46a6179Smrg			    $$= def;
339f46a6179Smrg			}
340f46a6179Smrg		;
341f46a6179Smrg
342f46a6179SmrgKeyAliasDecl	:	ALIAS KeyName EQUALS KeyName SEMI
343f46a6179Smrg			{
344f46a6179Smrg			    KeyAliasDef	*def;
345f46a6179Smrg			    def= KeyAliasCreate($2,$4);
346f46a6179Smrg			    if ($2)	free($2);
347f46a6179Smrg			    if ($4)	free($4);
348f46a6179Smrg			    $$= def;
349f46a6179Smrg			}
350f46a6179Smrg		;
351f46a6179Smrg
352f46a6179SmrgVModDecl	:	VIRTUAL_MODS VModDefList SEMI
353f46a6179Smrg			{ $$= $2; }
354f46a6179Smrg		;
355f46a6179Smrg
356f46a6179SmrgVModDefList	:	VModDefList COMMA VModDef
357f46a6179Smrg			{ $$= (VModDef *)AppendStmt(&$1->common,&$3->common); }
358f46a6179Smrg		|	VModDef
359f46a6179Smrg			{ $$= $1; }
360f46a6179Smrg		;
361f46a6179Smrg
362f46a6179SmrgVModDef		:	Ident
363f46a6179Smrg			{ $$= VModCreate($1,NULL); }
364f46a6179Smrg		|	Ident EQUALS Expr
365f46a6179Smrg			{ $$= VModCreate($1,$3); }
366f46a6179Smrg		;
367f46a6179Smrg
368f46a6179SmrgInterpretDecl	:	INTERPRET InterpretMatch OBRACE
369f46a6179Smrg			    VarDeclList
370f46a6179Smrg			CBRACE SEMI
371f46a6179Smrg			{
372f46a6179Smrg			    $2->def= $4;
373f46a6179Smrg			    $$= $2;
374f46a6179Smrg			}
375f46a6179Smrg		;
376f46a6179Smrg
377f46a6179SmrgInterpretMatch	:	KeySym PLUS Expr
378f46a6179Smrg			{ $$= InterpCreate((KeySym)$1,$3); }
379f46a6179Smrg		|	KeySym
380f46a6179Smrg			{ $$= InterpCreate((KeySym)$1,NULL); }
381f46a6179Smrg		;
382f46a6179Smrg
383f46a6179SmrgVarDeclList	:	VarDeclList VarDecl
384f46a6179Smrg			{ $$= (VarDef *)AppendStmt(&$1->common,&$2->common); }
385f46a6179Smrg		|	VarDecl
386f46a6179Smrg			{ $$= $1; }
387f46a6179Smrg		;
388f46a6179Smrg
389f46a6179SmrgKeyTypeDecl	:	TYPE String OBRACE
390f46a6179Smrg			    VarDeclList
391f46a6179Smrg			CBRACE SEMI
392f46a6179Smrg			{ $$= KeyTypeCreate($2,$4); }
393f46a6179Smrg		;
394f46a6179Smrg
395f46a6179SmrgSymbolsDecl	:	KEY KeyName OBRACE
396f46a6179Smrg			    SymbolsBody
397f46a6179Smrg			CBRACE SEMI
398f46a6179Smrg			{ $$= SymbolsCreate($2,(ExprDef *)$4); }
399f46a6179Smrg		;
400f46a6179Smrg
401f46a6179SmrgSymbolsBody	:	SymbolsBody COMMA SymbolsVarDecl
402f46a6179Smrg			{ $$= (VarDef *)AppendStmt(&$1->common,&$3->common); }
403f46a6179Smrg		|	SymbolsVarDecl
404f46a6179Smrg			{ $$= $1; }
405f46a6179Smrg		|	{ $$= NULL; }
406f46a6179Smrg		;
407f46a6179Smrg
408f46a6179SmrgSymbolsVarDecl	:	Lhs EQUALS Expr
409f46a6179Smrg			{ $$= VarCreate($1,$3); }
410f46a6179Smrg		|	Lhs EQUALS ArrayInit
411f46a6179Smrg			{ $$= VarCreate($1,$3); }
412f46a6179Smrg		|	Ident
413f46a6179Smrg			{ $$= BoolVarCreate($1,1); }
414f46a6179Smrg		|	EXCLAM Ident
415f46a6179Smrg			{ $$= BoolVarCreate($2,0); }
416f46a6179Smrg		|	ArrayInit
417f46a6179Smrg			{ $$= VarCreate(NULL,$1); }
418f46a6179Smrg		;
419f46a6179Smrg
420f46a6179SmrgArrayInit	:	OBRACKET OptKeySymList CBRACKET
421f46a6179Smrg			{ $$= $2; }
422f46a6179Smrg		|	OBRACKET ActionList CBRACKET
423f46a6179Smrg			{ $$= ExprCreateUnary(ExprActionList,TypeAction,$2); }
424f46a6179Smrg		;
425f46a6179Smrg
426f46a6179SmrgGroupCompatDecl	:	GROUP Integer EQUALS Expr SEMI
427f46a6179Smrg			{ $$= GroupCompatCreate($2,$4); }
428f46a6179Smrg		;
429f46a6179Smrg
430f46a6179SmrgModMapDecl	:	MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI
431f46a6179Smrg			{ $$= ModMapCreate($2,$4); }
432f46a6179Smrg		;
433f46a6179Smrg
434f46a6179SmrgIndicatorMapDecl:	INDICATOR String OBRACE VarDeclList CBRACE SEMI
435f46a6179Smrg			{ $$= IndicatorMapCreate($2,$4); }
436f46a6179Smrg		;
437f46a6179Smrg
438f46a6179SmrgIndicatorNameDecl:	INDICATOR Integer EQUALS Expr SEMI
439f46a6179Smrg			{ $$= IndicatorNameCreate($2,$4,False); }
440f46a6179Smrg		|	VIRTUAL INDICATOR Integer EQUALS Expr SEMI
441f46a6179Smrg			{ $$= IndicatorNameCreate($3,$5,True); }
442f46a6179Smrg		;
443f46a6179Smrg
444f46a6179SmrgShapeDecl	:	SHAPE String OBRACE OutlineList CBRACE SEMI
445f46a6179Smrg			{ $$= ShapeDeclCreate($2,(OutlineDef *)&$4->common); }
446f46a6179Smrg		|	SHAPE String OBRACE CoordList CBRACE SEMI
447f46a6179Smrg			{
448f46a6179Smrg			    OutlineDef *outlines;
449f46a6179Smrg			    outlines= OutlineCreate(None,$4);
450f46a6179Smrg			    $$= ShapeDeclCreate($2,outlines);
451f46a6179Smrg			}
452f46a6179Smrg		;
453f46a6179Smrg
454f46a6179SmrgSectionDecl	:	SECTION String OBRACE SectionBody CBRACE SEMI
455f46a6179Smrg			{ $$= SectionDeclCreate($2,$4); }
456f46a6179Smrg		;
457f46a6179Smrg
458f46a6179SmrgSectionBody	:	SectionBody SectionBodyItem
459f46a6179Smrg			{ $$=(RowDef *)AppendStmt(&$1->common,&$2->common);}
460f46a6179Smrg		|	SectionBodyItem
461f46a6179Smrg			{ $$= $1; }
462f46a6179Smrg		;
463f46a6179Smrg
464f46a6179SmrgSectionBodyItem	:	ROW OBRACE RowBody CBRACE SEMI
465f46a6179Smrg			{ $$= RowDeclCreate($3); }
466f46a6179Smrg		|	VarDecl
467f46a6179Smrg			{ $$= (RowDef *)$1; }
468f46a6179Smrg		|	DoodadDecl
469f46a6179Smrg			{ $$= (RowDef *)$1; }
470f46a6179Smrg		|	IndicatorMapDecl
471f46a6179Smrg			{ $$= (RowDef *)$1; }
472f46a6179Smrg		|	OverlayDecl
473f46a6179Smrg			{ $$= (RowDef *)$1; }
474f46a6179Smrg		;
475f46a6179Smrg
476f46a6179SmrgRowBody		:	RowBody RowBodyItem
477f46a6179Smrg			{ $$=(KeyDef *)AppendStmt(&$1->common,&$2->common);}
478f46a6179Smrg		|	RowBodyItem
479f46a6179Smrg			{ $$= $1; }
480f46a6179Smrg		;
481f46a6179Smrg
482f46a6179SmrgRowBodyItem	:	KEYS OBRACE Keys CBRACE SEMI
483f46a6179Smrg			{ $$= $3; }
484f46a6179Smrg		|	VarDecl
485f46a6179Smrg			{ $$= (KeyDef *)$1; }
486f46a6179Smrg		;
487f46a6179Smrg
488f46a6179SmrgKeys		:	Keys COMMA Key
489f46a6179Smrg			{ $$=(KeyDef *)AppendStmt(&$1->common,&$3->common);}
490f46a6179Smrg		|	Key
491f46a6179Smrg			{ $$= $1; }
492f46a6179Smrg		;
493f46a6179Smrg
494f46a6179SmrgKey		:	KeyName
495f46a6179Smrg			{ $$= KeyDeclCreate($1,NULL); }
496f46a6179Smrg		|	OBRACE ExprList CBRACE
497f46a6179Smrg			{ $$= KeyDeclCreate(NULL,$2); }
498f46a6179Smrg		;
499f46a6179Smrg
500f46a6179SmrgOverlayDecl	:	OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
501f46a6179Smrg			{ $$= OverlayDeclCreate($2,$4); }
502f46a6179Smrg		;
503f46a6179Smrg
504f46a6179SmrgOverlayKeyList	:	OverlayKeyList COMMA OverlayKey
505f46a6179Smrg			{
506f46a6179Smrg			    $$= (OverlayKeyDef *)
507f46a6179Smrg				AppendStmt(&$1->common,&$3->common);
508f46a6179Smrg			}
509f46a6179Smrg		|	OverlayKey
510f46a6179Smrg			{ $$= $1; }
511f46a6179Smrg		;
512f46a6179Smrg
513f46a6179SmrgOverlayKey	:	KeyName EQUALS KeyName
514f46a6179Smrg			{ $$= OverlayKeyCreate($1,$3); }
515f46a6179Smrg		;
516f46a6179Smrg
517f46a6179SmrgOutlineList	:	OutlineList COMMA OutlineInList
518f46a6179Smrg			{ $$=(OutlineDef *)AppendStmt(&$1->common,&$3->common);}
519f46a6179Smrg		|	OutlineInList
520f46a6179Smrg			{ $$= $1; }
521f46a6179Smrg		;
522f46a6179Smrg
523f46a6179SmrgOutlineInList	:	OBRACE CoordList CBRACE
524f46a6179Smrg			{ $$= OutlineCreate(None,$2); }
525f46a6179Smrg		|	Ident EQUALS OBRACE CoordList CBRACE
526f46a6179Smrg			{ $$= OutlineCreate($1,$4); }
527f46a6179Smrg		|	Ident EQUALS Expr
528f46a6179Smrg			{ $$= OutlineCreate($1,$3); }
529f46a6179Smrg		;
530f46a6179Smrg
531f46a6179SmrgCoordList	:	CoordList COMMA Coord
532f46a6179Smrg			{ $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
533f46a6179Smrg		|	Coord
534f46a6179Smrg			{ $$= $1; }
535f46a6179Smrg		;
536f46a6179Smrg
537f46a6179SmrgCoord		:	OBRACKET SignedNumber COMMA SignedNumber CBRACKET
538f46a6179Smrg			{
539f46a6179Smrg			    ExprDef *expr;
540f46a6179Smrg			    expr= ExprCreate(ExprCoord,TypeUnknown);
541f46a6179Smrg			    expr->value.coord.x= $2;
542f46a6179Smrg			    expr->value.coord.y= $4;
543f46a6179Smrg			    $$= expr;
544f46a6179Smrg			}
545f46a6179Smrg		;
546f46a6179Smrg
547f46a6179SmrgDoodadDecl	:	DoodadType String OBRACE VarDeclList CBRACE SEMI
548f46a6179Smrg			{ $$= DoodadCreate($1,$2,$4); }
549f46a6179Smrg		;
550f46a6179Smrg
551f46a6179SmrgDoodadType	:	TEXT			{ $$= XkbTextDoodad; }
552f46a6179Smrg		|	OUTLINE			{ $$= XkbOutlineDoodad; }
553f46a6179Smrg		|	SOLID			{ $$= XkbSolidDoodad; }
554f46a6179Smrg		|	LOGO			{ $$= XkbLogoDoodad; }
555f46a6179Smrg		;
556f46a6179Smrg
557f46a6179SmrgFieldSpec	:	Ident			{ $$= $1; }
558f46a6179Smrg		|	Element			{ $$= $1; }
559f46a6179Smrg		;
560f46a6179Smrg
561f46a6179SmrgElement		:	ACTION_TOK
562f46a6179Smrg			{ $$= XkbInternAtom(NULL,"action",False); }
563f46a6179Smrg		|	INTERPRET
564f46a6179Smrg			{ $$= XkbInternAtom(NULL,"interpret",False); }
565f46a6179Smrg		|	TYPE
566f46a6179Smrg			{ $$= XkbInternAtom(NULL,"type",False); }
567f46a6179Smrg		|	KEY
568f46a6179Smrg			{ $$= XkbInternAtom(NULL,"key",False); }
569f46a6179Smrg		|	GROUP
570f46a6179Smrg			{ $$= XkbInternAtom(NULL,"group",False); }
571f46a6179Smrg		|	MODIFIER_MAP
572f46a6179Smrg			{$$=XkbInternAtom(NULL,"modifier_map",False);}
573f46a6179Smrg		|	INDICATOR
574f46a6179Smrg			{ $$= XkbInternAtom(NULL,"indicator",False); }
575f46a6179Smrg		|	SHAPE
576f46a6179Smrg			{ $$= XkbInternAtom(NULL,"shape",False); }
577f46a6179Smrg		|	ROW
578f46a6179Smrg			{ $$= XkbInternAtom(NULL,"row",False); }
579f46a6179Smrg		|	SECTION
580f46a6179Smrg			{ $$= XkbInternAtom(NULL,"section",False); }
581f46a6179Smrg		|	TEXT
582f46a6179Smrg			{ $$= XkbInternAtom(NULL,"text",False); }
583f46a6179Smrg		;
584f46a6179Smrg
585f46a6179SmrgOptMergeMode	:	MergeMode		{ $$= $1; }
586f46a6179Smrg		|				{ $$= MergeDefault; }
587f46a6179Smrg		;
588f46a6179Smrg
589f46a6179SmrgMergeMode	:	INCLUDE			{ $$= MergeDefault; }
590f46a6179Smrg		|	AUGMENT			{ $$= MergeAugment; }
591f46a6179Smrg		|	OVERRIDE		{ $$= MergeOverride; }
592f46a6179Smrg		|	REPLACE			{ $$= MergeReplace; }
593f46a6179Smrg		|	ALTERNATE		{ $$= MergeAltForm; }
594f46a6179Smrg		;
595f46a6179Smrg
596f46a6179SmrgOptExprList	:	ExprList			{ $$= $1; }
597f46a6179Smrg		|				{ $$= NULL; }
598f46a6179Smrg		;
599f46a6179Smrg
600f46a6179SmrgExprList	:	ExprList COMMA Expr
601f46a6179Smrg			{ $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
602f46a6179Smrg		|	Expr
603f46a6179Smrg			{ $$= $1; }
604f46a6179Smrg		;
605f46a6179Smrg
606f46a6179SmrgExpr		:	Expr DIVIDE Expr
607f46a6179Smrg			{ $$= ExprCreateBinary(OpDivide,$1,$3); }
608f46a6179Smrg		|	Expr PLUS Expr
609f46a6179Smrg			{ $$= ExprCreateBinary(OpAdd,$1,$3); }
610f46a6179Smrg		|	Expr MINUS Expr
611f46a6179Smrg			{ $$= ExprCreateBinary(OpSubtract,$1,$3); }
612f46a6179Smrg		|	Expr TIMES Expr
613f46a6179Smrg			{ $$= ExprCreateBinary(OpMultiply,$1,$3); }
614f46a6179Smrg		|	Lhs EQUALS Expr
615f46a6179Smrg			{ $$= ExprCreateBinary(OpAssign,$1,$3); }
616f46a6179Smrg		|	Term
617f46a6179Smrg			{ $$= $1; }
618f46a6179Smrg		;
619f46a6179Smrg
620f46a6179SmrgTerm		:	MINUS Term
621f46a6179Smrg			{ $$= ExprCreateUnary(OpNegate,$2->type,$2); }
622f46a6179Smrg		|	PLUS Term
623f46a6179Smrg			{ $$= ExprCreateUnary(OpUnaryPlus,$2->type,$2); }
624f46a6179Smrg		|	EXCLAM Term
625f46a6179Smrg			{ $$= ExprCreateUnary(OpNot,TypeBoolean,$2); }
626f46a6179Smrg		|	INVERT Term
627f46a6179Smrg			{ $$= ExprCreateUnary(OpInvert,$2->type,$2); }
628f46a6179Smrg		|	Lhs
629f46a6179Smrg			{ $$= $1;  }
630f46a6179Smrg		|	FieldSpec OPAREN OptExprList CPAREN %prec OPAREN
631f46a6179Smrg			{ $$= ActionCreate($1,$3); }
632f46a6179Smrg		|	Terminal
633f46a6179Smrg			{ $$= $1;  }
634f46a6179Smrg		|	OPAREN Expr CPAREN
635f46a6179Smrg			{ $$= $2;  }
636f46a6179Smrg		;
637f46a6179Smrg
638f46a6179SmrgActionList	:	ActionList COMMA Action
639f46a6179Smrg			{ $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
640f46a6179Smrg		|	Action
641f46a6179Smrg			{ $$= $1; }
642f46a6179Smrg		;
643f46a6179Smrg
644f46a6179SmrgAction		:	FieldSpec OPAREN OptExprList CPAREN
645f46a6179Smrg			{ $$= ActionCreate($1,$3); }
646f46a6179Smrg		;
647f46a6179Smrg
648f46a6179SmrgLhs		:	FieldSpec
649f46a6179Smrg			{
650f46a6179Smrg			    ExprDef *expr;
651f46a6179Smrg                            expr= ExprCreate(ExprIdent,TypeUnknown);
652f46a6179Smrg                            expr->value.str= $1;
653f46a6179Smrg                            $$= expr;
654f46a6179Smrg			}
655f46a6179Smrg		|	FieldSpec DOT FieldSpec
656f46a6179Smrg                        {
657f46a6179Smrg                            ExprDef *expr;
658f46a6179Smrg                            expr= ExprCreate(ExprFieldRef,TypeUnknown);
659f46a6179Smrg                            expr->value.field.element= $1;
660f46a6179Smrg                            expr->value.field.field= $3;
661f46a6179Smrg                            $$= expr;
662f46a6179Smrg			}
663f46a6179Smrg		|	FieldSpec OBRACKET Expr CBRACKET
664f46a6179Smrg			{
665f46a6179Smrg			    ExprDef *expr;
666f46a6179Smrg			    expr= ExprCreate(ExprArrayRef,TypeUnknown);
667f46a6179Smrg			    expr->value.array.element= None;
668f46a6179Smrg			    expr->value.array.field= $1;
669f46a6179Smrg			    expr->value.array.entry= $3;
670f46a6179Smrg			    $$= expr;
671f46a6179Smrg			}
672f46a6179Smrg		|	FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET
673f46a6179Smrg			{
674f46a6179Smrg			    ExprDef *expr;
675f46a6179Smrg			    expr= ExprCreate(ExprArrayRef,TypeUnknown);
676f46a6179Smrg			    expr->value.array.element= $1;
677f46a6179Smrg			    expr->value.array.field= $3;
678f46a6179Smrg			    expr->value.array.entry= $5;
679f46a6179Smrg			    $$= expr;
680f46a6179Smrg			}
681f46a6179Smrg		;
682f46a6179Smrg
683f46a6179SmrgTerminal	:	String
684f46a6179Smrg			{
685f46a6179Smrg			    ExprDef *expr;
686f46a6179Smrg                            expr= ExprCreate(ExprValue,TypeString);
687f46a6179Smrg                            expr->value.str= $1;
688f46a6179Smrg                            $$= expr;
689f46a6179Smrg			}
690f46a6179Smrg		|	Integer
691f46a6179Smrg			{
692f46a6179Smrg			    ExprDef *expr;
693f46a6179Smrg                            expr= ExprCreate(ExprValue,TypeInt);
694f46a6179Smrg                            expr->value.ival= $1;
695f46a6179Smrg                            $$= expr;
696f46a6179Smrg			}
697f46a6179Smrg		|	Float
698f46a6179Smrg			{
699f46a6179Smrg			    ExprDef *expr;
700f46a6179Smrg			    expr= ExprCreate(ExprValue,TypeFloat);
701f46a6179Smrg			    expr->value.ival= $1;
702f46a6179Smrg			    $$= expr;
703f46a6179Smrg			}
704f46a6179Smrg		|	KeyName
705f46a6179Smrg			{
706f46a6179Smrg			    ExprDef *expr;
707f46a6179Smrg			    expr= ExprCreate(ExprValue,TypeKeyName);
708f46a6179Smrg			    memset(expr->value.keyName,0,5);
709f46a6179Smrg			    strncpy(expr->value.keyName,$1,4);
710f46a6179Smrg			    free($1);
711f46a6179Smrg			    $$= expr;
712f46a6179Smrg			}
713f46a6179Smrg		;
714f46a6179Smrg
715f46a6179SmrgOptKeySymList	:	KeySymList			{ $$= $1; }
716f46a6179Smrg		|					{ $$= NULL; }
717f46a6179Smrg		;
718f46a6179Smrg
719f46a6179SmrgKeySymList	:	KeySymList COMMA KeySym
720f46a6179Smrg			{ $$= AppendKeysymList($1,(KeySym)$3); }
721f46a6179Smrg		|	KeySym
722f46a6179Smrg			{ $$= CreateKeysymList((KeySym)$1); }
723f46a6179Smrg		;
724f46a6179Smrg
725f46a6179SmrgKeySym		:	IDENT
726f46a6179Smrg			{
727f46a6179Smrg			    KeySym sym;
728f46a6179Smrg			    if (LookupKeysym(scanStr,&sym))
729f46a6179Smrg				$$= sym;
730f46a6179Smrg			    else {
731f46a6179Smrg				char buf[120];
732f46a6179Smrg				sprintf(buf,"expected keysym, got %s",
733f46a6179Smrg							uStringText(scanStr));
734f46a6179Smrg				yyerror(buf);
735f46a6179Smrg				yynerrs++;
736f46a6179Smrg				$$= NoSymbol;
737f46a6179Smrg			    }
738f46a6179Smrg			}
739f46a6179Smrg		|	SECTION
740f46a6179Smrg			{
741f46a6179Smrg			    $$= XK_section;
742f46a6179Smrg			}
743f46a6179Smrg		|	Integer
744f46a6179Smrg			{
745f46a6179Smrg			    if ($1<10)	$$= $1+'0';	/* XK_0 .. XK_9 */
746f46a6179Smrg			    else	$$= $1;
747f46a6179Smrg			}
748f46a6179Smrg		;
749f46a6179Smrg
750f46a6179SmrgSignedNumber	:	MINUS Number    { $$= -$2; }
751f46a6179Smrg		|	Number              { $$= $1; }
752f46a6179Smrg		;
753f46a6179Smrg
754f46a6179SmrgNumber		:	FLOAT		{ $$= scanInt; }
755f46a6179Smrg		|	INTEGER		{ $$= scanInt*XkbGeomPtsPerMM; }
756f46a6179Smrg		;
757f46a6179Smrg
758f46a6179SmrgFloat		:	FLOAT		{ $$= scanInt; }
759f46a6179Smrg		;
760f46a6179Smrg
761f46a6179SmrgInteger		:	INTEGER		{ $$= scanInt; }
762f46a6179Smrg		;
763f46a6179Smrg
764f46a6179SmrgKeyName		:	KEYNAME		{ $$= scanStr; scanStr= NULL; }
765f46a6179Smrg		;
766f46a6179Smrg
767f46a6179SmrgIdent		:	IDENT	{ $$= XkbInternAtom(NULL,scanStr,False); }
768f46a6179Smrg		|	DEFAULT { $$= XkbInternAtom(NULL,"default",False); }
769f46a6179Smrg		;
770f46a6179Smrg
771f46a6179SmrgString		:	STRING	{ $$= XkbInternAtom(NULL,scanStr,False); }
772f46a6179Smrg		;
773f46a6179Smrg
774f46a6179SmrgOptMapName	:	MapName	{ $$= $1; }
775f46a6179Smrg		|		{ $$= NULL; }
776f46a6179Smrg		;
777f46a6179Smrg
778f46a6179SmrgMapName		:	STRING 	{ $$= scanStr; scanStr= NULL; }
779f46a6179Smrg		;
780f46a6179Smrg%%
781f46a6179Smrgvoid
782f46a6179Smrgyyerror(const char *s)
783f46a6179Smrg{
784f46a6179Smrg    if (warningLevel>0) {
785f46a6179Smrg	(void)fprintf(stderr,"%s: line %d of %s\n",s,lineNum,
786f46a6179Smrg					(scanFile?scanFile:"(unknown)"));
787f46a6179Smrg	if ((scanStr)&&(warningLevel>3))
788f46a6179Smrg	    (void)fprintf(stderr,"last scanned symbol is: %s\n",scanStr);
789f46a6179Smrg    }
790f46a6179Smrg    return;
791f46a6179Smrg}
792f46a6179Smrg
793f46a6179Smrg
794f46a6179Smrgint
795f46a6179Smrgyywrap(void)
796f46a6179Smrg{
797f46a6179Smrg   return 1;
798f46a6179Smrg}
799f46a6179Smrg
800