1 /************************************************************
2 Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 ********************************************************/
28 #include "xkbcomp-priv.h"
29 #include "parseutils.h"
31 #pragma GCC diagnostic ignored "-Wredundant-decls"
33 extern int yylex(union YYSTYPE *val, struct YYLTYPE *loc, void *scanner);
36 yyerror(struct YYLTYPE *loc, struct parser_param *param, const char *msg)
38 scanner_error(loc, param->scanner, msg);
41 #define scanner param->scanner
46 %lex-param { void *scanner }
47 %parse-param { struct parser_param *param }
124 enum xkb_file_type file_type;
126 char keyName[XkbKeyNameLength];
128 enum merge_mode merge;
137 GroupCompatDef *groupCompat;
138 IndicatorMapDef *ledMap;
139 IndicatorNameDef *ledName;
141 KeyAliasDef *keyAlias;
145 %type <num> INTEGER FLOAT
146 %type <str> IDENT STRING
147 %type <keyName> KEYNAME KeyName
148 %type <ival> Number Integer Float SignedNumber
149 %type <merge> MergeMode OptMergeMode
150 %type <file_type> XkbCompositeType FileType
151 %type <uval> DoodadType Flag Flags OptFlags KeyCode
152 %type <str> MapName OptMapName KeySym
153 %type <sval> FieldSpec Ident Element String
154 %type <any> DeclList Decl
155 %type <expr> OptExprList ExprList Expr Term Lhs Terminal ArrayInit KeySyms
156 %type <expr> OptKeySymList KeySymList Action ActionList Coord CoordList
157 %type <var> VarDecl VarDeclList SymbolsBody SymbolsVarDecl
158 %type <vmod> VModDecl VModDefList VModDef
159 %type <interp> InterpretDecl InterpretMatch
160 %type <keyType> KeyTypeDecl
161 %type <syms> SymbolsDecl
162 %type <modMask> ModMapDecl
163 %type <groupCompat> GroupCompatDecl
164 %type <ledMap> IndicatorMapDecl
165 %type <ledName> IndicatorNameDecl
166 %type <keyCode> KeyNameDecl
167 %type <keyAlias> KeyAliasDecl
168 %type <geom> ShapeDecl SectionDecl SectionBody SectionBodyItem RowBody RowBodyItem
169 %type <geom> Keys Key OverlayDecl OverlayKeyList OverlayKey OutlineList OutlineInList
170 %type <geom> DoodadDecl
171 %type <file> XkbFile XkbMapConfigList XkbMapConfig XkbConfig
172 %type <file> XkbCompositeMap XkbCompMapList
174 XkbFile : XkbCompMapList
175 { $$= param->rtrn= $1; }
177 { $$= param->rtrn= $1; }
179 { $$= param->rtrn= $1; }
182 XkbCompMapList : XkbCompMapList XkbCompositeMap
183 { $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); }
188 XkbCompositeMap : OptFlags XkbCompositeType OptMapName OBRACE
192 $$ = CreateXKBFile(param->ctx, $2, $3,
197 XkbCompositeType: XKB_KEYMAP { $$= FILE_TYPE_KEYMAP; }
198 | XKB_SEMANTICS { $$= FILE_TYPE_KEYMAP; }
199 | XKB_LAYOUT { $$= FILE_TYPE_KEYMAP; }
202 XkbMapConfigList : XkbMapConfigList XkbMapConfig
207 $$= (XkbFile *)AppendStmt(&$1->common,&$2->common);
213 XkbMapConfig : OptFlags FileType OptMapName OBRACE
217 if ($2 == FILE_TYPE_GEOMETRY)
225 $$ = CreateXKBFile(param->ctx, $2, $3, $5, $1);
230 XkbConfig : OptFlags FileType OptMapName DeclList
232 if ($2 == FILE_TYPE_GEOMETRY)
240 $$ = CreateXKBFile(param->ctx, $2, $3, $4, $1);
246 FileType : XKB_KEYCODES { $$= FILE_TYPE_KEYCODES; }
247 | XKB_TYPES { $$= FILE_TYPE_TYPES; }
248 | XKB_COMPATMAP { $$= FILE_TYPE_COMPAT; }
249 | XKB_SYMBOLS { $$= FILE_TYPE_SYMBOLS; }
250 | XKB_GEOMETRY { $$= FILE_TYPE_GEOMETRY; }
253 OptFlags : Flags { $$= $1; }
257 Flags : Flags Flag { $$= (($1)|($2)); }
261 Flag : PARTIAL { $$= XkbLC_Partial; }
262 | DEFAULT { $$= XkbLC_Default; }
263 | HIDDEN { $$= XkbLC_Hidden; }
264 | ALPHANUMERIC_KEYS { $$= XkbLC_AlphanumericKeys; }
265 | MODIFIER_KEYS { $$= XkbLC_ModifierKeys; }
266 | KEYPAD_KEYS { $$= XkbLC_KeypadKeys; }
267 | FUNCTION_KEYS { $$= XkbLC_FunctionKeys; }
268 | ALTERNATE_GROUP { $$= XkbLC_AlternateGroup; }
271 DeclList : DeclList Decl
272 { $$= AppendStmt($1,$2); }
276 Decl : OptMergeMode VarDecl
281 | OptMergeMode VModDecl
286 | OptMergeMode InterpretDecl
291 | OptMergeMode KeyNameDecl
296 | OptMergeMode KeyAliasDecl
301 | OptMergeMode KeyTypeDecl
306 | OptMergeMode SymbolsDecl
311 | OptMergeMode ModMapDecl
316 | OptMergeMode GroupCompatDecl
321 | OptMergeMode IndicatorMapDecl
326 | OptMergeMode IndicatorNameDecl
331 | OptMergeMode ShapeDecl
334 | OptMergeMode SectionDecl
337 | OptMergeMode DoodadDecl
342 $$= &IncludeCreate(param->ctx, $2, $1)->common;
347 VarDecl : Lhs EQUALS Expr SEMI
348 { $$= VarCreate($1,$3); }
350 { $$= BoolVarCreate($1,1); }
352 { $$= BoolVarCreate($2,0); }
355 KeyNameDecl : KeyName EQUALS KeyCode SEMI
357 $$ = KeycodeCreate($1, $3);
361 KeyAliasDecl : ALIAS KeyName EQUALS KeyName SEMI
363 $$= KeyAliasCreate($2,$4);
367 VModDecl : VIRTUAL_MODS VModDefList SEMI
371 VModDefList : VModDefList COMMA VModDef
372 { $$= (VModDef *)AppendStmt(&$1->common,&$3->common); }
378 { $$= VModCreate($1,NULL); }
380 { $$= VModCreate($1,$3); }
383 InterpretDecl : INTERPRET InterpretMatch OBRACE
392 InterpretMatch : KeySym PLUS Expr
393 { $$= InterpCreate($1, $3); }
395 { $$= InterpCreate($1, NULL); }
398 VarDeclList : VarDeclList VarDecl
399 { $$= (VarDef *)AppendStmt(&$1->common,&$2->common); }
404 KeyTypeDecl : TYPE String OBRACE
407 { $$= KeyTypeCreate($2,$4); }
410 SymbolsDecl : KEY KeyName OBRACE
413 { $$= SymbolsCreate($2,(ExprDef *)$4); }
416 SymbolsBody : SymbolsBody COMMA SymbolsVarDecl
417 { $$= (VarDef *)AppendStmt(&$1->common,&$3->common); }
423 SymbolsVarDecl : Lhs EQUALS Expr
424 { $$= VarCreate($1,$3); }
425 | Lhs EQUALS ArrayInit
426 { $$= VarCreate($1,$3); }
428 { $$= BoolVarCreate($1,1); }
430 { $$= BoolVarCreate($2,0); }
432 { $$= VarCreate(NULL,$1); }
435 ArrayInit : OBRACKET OptKeySymList CBRACKET
437 | OBRACKET ActionList CBRACKET
438 { $$= ExprCreateUnary(ExprActionList,TypeAction,$2); }
441 GroupCompatDecl : GROUP Integer EQUALS Expr SEMI
442 { $$= GroupCompatCreate($2,$4); }
445 ModMapDecl : MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI
446 { $$= ModMapCreate($2,$4); }
449 IndicatorMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI
450 { $$= IndicatorMapCreate($2,$4); }
453 IndicatorNameDecl: INDICATOR Integer EQUALS Expr SEMI
454 { $$= IndicatorNameCreate($2,$4,false); }
455 | VIRTUAL INDICATOR Integer EQUALS Expr SEMI
456 { $$= IndicatorNameCreate($3,$5,true); }
459 ShapeDecl : SHAPE String OBRACE OutlineList CBRACE SEMI
461 | SHAPE String OBRACE CoordList CBRACE SEMI
465 SectionDecl : SECTION String OBRACE SectionBody CBRACE SEMI
469 SectionBody : SectionBody SectionBodyItem
475 SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI
478 { FreeStmt(&$1->common); $$= NULL; }
482 { FreeStmt(&$1->common); $$= NULL; }
487 RowBody : RowBody RowBodyItem
493 RowBodyItem : KEYS OBRACE Keys CBRACE SEMI
496 { FreeStmt(&$1->common); $$= NULL; }
499 Keys : Keys COMMA Key
507 | OBRACE ExprList CBRACE
508 { FreeStmt(&$2->common); $$= NULL; }
511 OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
515 OverlayKeyList : OverlayKeyList COMMA OverlayKey
521 OverlayKey : KeyName EQUALS KeyName
525 OutlineList : OutlineList COMMA OutlineInList
531 OutlineInList : OBRACE CoordList CBRACE
533 | Ident EQUALS OBRACE CoordList CBRACE
536 { FreeStmt(&$3->common); $$= NULL; }
539 CoordList : CoordList COMMA Coord
545 Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET
549 DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI
550 { FreeStmt(&$4->common); $$= NULL; }
553 DoodadType : TEXT { $$= 0; }
559 FieldSpec : Ident { $$= $1; }
560 | Element { $$= $1; }
564 { $$= xkb_atom_intern(param->ctx, "action"); }
566 { $$= xkb_atom_intern(param->ctx, "interpret"); }
568 { $$= xkb_atom_intern(param->ctx, "type"); }
570 { $$= xkb_atom_intern(param->ctx, "key"); }
572 { $$= xkb_atom_intern(param->ctx, "group"); }
574 {$$= xkb_atom_intern(param->ctx, "modifier_map");}
576 { $$= xkb_atom_intern(param->ctx, "indicator"); }
578 { $$= xkb_atom_intern(param->ctx, "shape"); }
580 { $$= XKB_ATOM_NONE; }
582 { $$= XKB_ATOM_NONE; }
584 { $$= XKB_ATOM_NONE; }
587 OptMergeMode : MergeMode { $$= $1; }
588 | { $$= MERGE_DEFAULT; }
591 MergeMode : INCLUDE { $$= MERGE_DEFAULT; }
592 | AUGMENT { $$= MERGE_AUGMENT; }
593 | OVERRIDE { $$= MERGE_OVERRIDE; }
594 | REPLACE { $$= MERGE_REPLACE; }
598 * This used to be MERGE_ALT_FORM. This functionality was
599 * unused and has been removed.
605 OptExprList : ExprList { $$= $1; }
609 ExprList : ExprList COMMA Expr
610 { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
615 Expr : Expr DIVIDE Expr
616 { $$= ExprCreateBinary(OpDivide,$1,$3); }
618 { $$= ExprCreateBinary(OpAdd,$1,$3); }
620 { $$= ExprCreateBinary(OpSubtract,$1,$3); }
622 { $$= ExprCreateBinary(OpMultiply,$1,$3); }
624 { $$= ExprCreateBinary(OpAssign,$1,$3); }
630 { $$= ExprCreateUnary(OpNegate,$2->type,$2); }
632 { $$= ExprCreateUnary(OpUnaryPlus,$2->type,$2); }
634 { $$= ExprCreateUnary(OpNot,TypeBoolean,$2); }
636 { $$= ExprCreateUnary(OpInvert,$2->type,$2); }
639 | FieldSpec OPAREN OptExprList CPAREN %prec OPAREN
640 { $$= ActionCreate($1,$3); }
647 ActionList : ActionList COMMA Action
648 { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
653 Action : FieldSpec OPAREN OptExprList CPAREN
654 { $$= ActionCreate($1,$3); }
660 expr= ExprCreate(ExprIdent,TypeUnknown);
664 | FieldSpec DOT FieldSpec
667 expr= ExprCreate(ExprFieldRef,TypeUnknown);
668 expr->value.field.element= $1;
669 expr->value.field.field= $3;
672 | FieldSpec OBRACKET Expr CBRACKET
675 expr= ExprCreate(ExprArrayRef,TypeUnknown);
676 expr->value.array.element= XKB_ATOM_NONE;
677 expr->value.array.field= $1;
678 expr->value.array.entry= $3;
681 | FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET
684 expr= ExprCreate(ExprArrayRef,TypeUnknown);
685 expr->value.array.element= $1;
686 expr->value.array.field= $3;
687 expr->value.array.entry= $5;
695 expr= ExprCreate(ExprValue,TypeString);
702 expr= ExprCreate(ExprValue,TypeInt);
703 expr->value.ival= $1;
713 expr= ExprCreate(ExprValue,TypeKeyName);
714 strncpy(expr->value.keyName,$1,4);
719 OptKeySymList : KeySymList { $$= $1; }
723 KeySymList : KeySymList COMMA KeySym
724 { $$= AppendKeysymList($1,$3); }
725 | KeySymList COMMA KeySyms
726 { $$= AppendMultiKeysymList($1,$3); }
728 { $$= CreateKeysymList($1); }
730 { $$= CreateMultiKeysymList($1); }
733 KeySyms : OBRACE KeySymList CBRACE
737 KeySym : IDENT { $$= $1; }
738 | SECTION { $$= strdup("section"); }
741 if ($1 < 10) { /* XK_0 .. XK_9 */
748 snprintf($$, 17, "0x%x", $1);
753 SignedNumber : MINUS Number { $$= -$2; }
757 Number : FLOAT { $$= $1; }
758 | INTEGER { $$= $1*XkbGeomPtsPerMM; }
761 Float : FLOAT { $$= 0; }
764 Integer : INTEGER { $$= $1; }
767 KeyCode : INTEGER { $$= $1; }
770 KeyName : KEYNAME { strncpy($$, $1, XkbKeyNameLength); }
775 $$ = xkb_atom_steal(param->ctx, $1);
779 $$ = xkb_atom_intern(param->ctx, "default");
785 $$ = xkb_atom_steal(param->ctx, $1);
789 OptMapName : MapName { $$= $1; }
793 MapName : STRING { $$= $1; }