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