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 "ast-build.h"
30 #include "parser-priv.h"
33 _xkbcommon_error(struct YYLTYPE *loc, struct parser_param *param, const char *msg)
35 scanner_error(loc, param->scanner, msg);
38 #define scanner param->scanner
41 %name-prefix "_xkbcommon_"
44 %lex-param { void *scanner }
45 %parse-param { struct parser_param *param }
124 enum xkb_file_type file_type;
126 char keyName[XKB_KEY_NAME_LENGTH];
128 enum merge_mode merge;
129 enum xkb_map_flags mapFlags;
138 GroupCompatDef *groupCompat;
139 IndicatorMapDef *ledMap;
140 IndicatorNameDef *ledName;
142 KeyAliasDef *keyAlias;
147 %type <num> INTEGER FLOAT
148 %type <str> IDENT STRING
149 %type <keyName> KEYNAME KeyName
150 %type <ival> Number Integer Float SignedNumber
151 %type <merge> MergeMode OptMergeMode
152 %type <file_type> XkbCompositeType FileType
153 %type <uval> DoodadType
154 %type <mapFlags> Flag Flags OptFlags KeyCode
155 %type <str> MapName OptMapName KeySym
156 %type <sval> FieldSpec Ident Element String
157 %type <any> DeclList Decl
158 %type <expr> OptExprList ExprList Expr Term Lhs Terminal ArrayInit KeySyms
159 %type <expr> OptKeySymList KeySymList Action ActionList Coord CoordList
160 %type <var> VarDecl VarDeclList SymbolsBody SymbolsVarDecl
161 %type <vmod> VModDecl VModDefList VModDef
162 %type <interp> InterpretDecl InterpretMatch
163 %type <keyType> KeyTypeDecl
164 %type <syms> SymbolsDecl
165 %type <modMask> ModMapDecl
166 %type <groupCompat> GroupCompatDecl
167 %type <ledMap> IndicatorMapDecl
168 %type <ledName> IndicatorNameDecl
169 %type <keyCode> KeyNameDecl
170 %type <keyAlias> KeyAliasDecl
171 %type <geom> ShapeDecl SectionDecl SectionBody SectionBodyItem RowBody RowBodyItem
172 %type <geom> Keys Key OverlayDecl OverlayKeyList OverlayKey OutlineList OutlineInList
173 %type <geom> DoodadDecl
174 %type <file> XkbFile XkbMapConfigList XkbMapConfig XkbConfig
175 %type <file> XkbCompositeMap XkbCompMapList
179 XkbFile : XkbCompMapList
180 { $$ = param->rtrn = $1; }
182 { $$ = param->rtrn = $1; }
184 { $$ = param->rtrn = $1; }
187 XkbCompMapList : XkbCompMapList XkbCompositeMap
188 { $$ = (XkbFile *)AppendStmt(&$1->common, &$2->common); }
193 XkbCompositeMap : OptFlags XkbCompositeType OptMapName OBRACE
196 { $$ = XkbFileCreate(param->ctx, $2, $3, &$5->common, $1); }
199 XkbCompositeType: XKB_KEYMAP { $$ = FILE_TYPE_KEYMAP; }
200 | XKB_SEMANTICS { $$ = FILE_TYPE_KEYMAP; }
201 | XKB_LAYOUT { $$ = FILE_TYPE_KEYMAP; }
204 XkbMapConfigList : XkbMapConfigList XkbMapConfig
209 $$ = (XkbFile *)AppendStmt(&$1->common, &$2->common);
215 XkbMapConfig : OptFlags FileType OptMapName OBRACE
219 if ($2 == FILE_TYPE_GEOMETRY) {
225 $$ = XkbFileCreate(param->ctx, $2, $3, $5, $1);
230 XkbConfig : OptFlags FileType OptMapName DeclList
232 if ($2 == FILE_TYPE_GEOMETRY) {
238 $$ = XkbFileCreate(param->ctx, $2, $3, $4, $1);
244 FileType : XKB_KEYCODES { $$ = FILE_TYPE_KEYCODES; }
245 | XKB_TYPES { $$ = FILE_TYPE_TYPES; }
246 | XKB_COMPATMAP { $$ = FILE_TYPE_COMPAT; }
247 | XKB_SYMBOLS { $$ = FILE_TYPE_SYMBOLS; }
248 | XKB_GEOMETRY { $$ = FILE_TYPE_GEOMETRY; }
251 OptFlags : Flags { $$ = $1; }
255 Flags : Flags Flag { $$ = ($1 | $2); }
259 Flag : PARTIAL { $$ = MAP_IS_PARTIAL; }
260 | DEFAULT { $$ = MAP_IS_DEFAULT; }
261 | HIDDEN { $$ = MAP_IS_HIDDEN; }
262 | ALPHANUMERIC_KEYS { $$ = MAP_HAS_ALPHANUMERIC; }
263 | MODIFIER_KEYS { $$ = MAP_HAS_MODIFIER; }
264 | KEYPAD_KEYS { $$ = MAP_HAS_KEYPAD; }
265 | FUNCTION_KEYS { $$ = MAP_HAS_FN; }
266 | ALTERNATE_GROUP { $$ = MAP_IS_ALTGR; }
269 DeclList : DeclList Decl
270 { $$ = AppendStmt($1, $2); }
274 Decl : OptMergeMode VarDecl
279 | OptMergeMode VModDecl
284 | OptMergeMode InterpretDecl
289 | OptMergeMode KeyNameDecl
294 | OptMergeMode KeyAliasDecl
299 | OptMergeMode KeyTypeDecl
304 | OptMergeMode SymbolsDecl
309 | OptMergeMode ModMapDecl
314 | OptMergeMode GroupCompatDecl
319 | OptMergeMode IndicatorMapDecl
324 | OptMergeMode IndicatorNameDecl
329 | OptMergeMode ShapeDecl { }
330 | OptMergeMode SectionDecl { }
331 | OptMergeMode DoodadDecl { }
334 $$ = &IncludeCreate(param->ctx, $2, $1)->common;
339 VarDecl : Lhs EQUALS Expr SEMI
340 { $$ = VarCreate($1, $3); }
342 { $$ = BoolVarCreate($1, 1); }
344 { $$ = BoolVarCreate($2, 0); }
347 KeyNameDecl : KeyName EQUALS KeyCode SEMI
348 { $$ = KeycodeCreate($1, $3); }
351 KeyAliasDecl : ALIAS KeyName EQUALS KeyName SEMI
352 { $$ = KeyAliasCreate($2, $4); }
355 VModDecl : VIRTUAL_MODS VModDefList SEMI
359 VModDefList : VModDefList COMMA VModDef
360 { $$ = (VModDef *)AppendStmt(&$1->common, &$3->common); }
366 { $$ = VModCreate($1, NULL); }
368 { $$ = VModCreate($1, $3); }
371 InterpretDecl : INTERPRET InterpretMatch OBRACE
374 { $2->def = $4; $$ = $2; }
377 InterpretMatch : KeySym PLUS Expr
378 { $$ = InterpCreate($1, $3); }
380 { $$ = InterpCreate($1, NULL); }
383 VarDeclList : VarDeclList VarDecl
384 { $$ = (VarDef *)AppendStmt(&$1->common, &$2->common); }
389 KeyTypeDecl : TYPE String OBRACE
392 { $$ = KeyTypeCreate($2, $4); }
395 SymbolsDecl : KEY KeyName OBRACE
398 { $$ = SymbolsCreate($2, (ExprDef *)$4); }
401 SymbolsBody : SymbolsBody COMMA SymbolsVarDecl
402 { $$ = (VarDef *)AppendStmt(&$1->common, &$3->common); }
408 SymbolsVarDecl : Lhs EQUALS Expr { $$ = VarCreate($1, $3); }
409 | Lhs EQUALS ArrayInit { $$ = VarCreate($1, $3); }
410 | Ident { $$ = BoolVarCreate($1, 1); }
411 | EXCLAM Ident { $$ = BoolVarCreate($2, 0); }
412 | ArrayInit { $$ = VarCreate(NULL, $1); }
415 ArrayInit : OBRACKET OptKeySymList CBRACKET
417 | OBRACKET ActionList CBRACKET
418 { $$ = ExprCreateUnary(EXPR_ACTION_LIST, EXPR_TYPE_ACTION, $2); }
421 GroupCompatDecl : GROUP Integer EQUALS Expr SEMI
422 { $$ = GroupCompatCreate($2, $4); }
425 ModMapDecl : MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI
426 { $$ = ModMapCreate($2, $4); }
429 IndicatorMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI
430 { $$ = IndicatorMapCreate($2, $4); }
433 IndicatorNameDecl: INDICATOR Integer EQUALS Expr SEMI
434 { $$ = IndicatorNameCreate($2, $4, false); }
435 | VIRTUAL INDICATOR Integer EQUALS Expr SEMI
436 { $$ = IndicatorNameCreate($3, $5, true); }
439 ShapeDecl : SHAPE String OBRACE OutlineList CBRACE SEMI
441 | SHAPE String OBRACE CoordList CBRACE SEMI
445 SectionDecl : SECTION String OBRACE SectionBody CBRACE SEMI
449 SectionBody : SectionBody SectionBodyItem { $$ = NULL;}
450 | SectionBodyItem { $$ = NULL; }
453 SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI
456 { FreeStmt(&$1->common); $$ = NULL; }
460 { FreeStmt(&$1->common); $$ = NULL; }
465 RowBody : RowBody RowBodyItem { $$ = NULL;}
466 | RowBodyItem { $$ = NULL; }
469 RowBodyItem : KEYS OBRACE Keys CBRACE SEMI { $$ = NULL; }
471 { FreeStmt(&$1->common); $$ = NULL; }
474 Keys : Keys COMMA Key { $$ = NULL; }
480 | OBRACE ExprList CBRACE
481 { FreeStmt(&$2->common); $$ = NULL; }
484 OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
488 OverlayKeyList : OverlayKeyList COMMA OverlayKey { $$ = NULL; }
489 | OverlayKey { $$ = NULL; }
492 OverlayKey : KeyName EQUALS KeyName { $$ = NULL; }
495 OutlineList : OutlineList COMMA OutlineInList
501 OutlineInList : OBRACE CoordList CBRACE
503 | Ident EQUALS OBRACE CoordList CBRACE
506 { FreeStmt(&$3->common); $$ = NULL; }
509 CoordList : CoordList COMMA Coord
515 Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET
519 DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI
520 { FreeStmt(&$4->common); $$ = NULL; }
523 DoodadType : TEXT { $$ = 0; }
524 | OUTLINE { $$ = 0; }
529 FieldSpec : Ident { $$ = $1; }
530 | Element { $$ = $1; }
534 { $$ = xkb_atom_intern(param->ctx, "action"); }
536 { $$ = xkb_atom_intern(param->ctx, "interpret"); }
538 { $$ = xkb_atom_intern(param->ctx, "type"); }
540 { $$ = xkb_atom_intern(param->ctx, "key"); }
542 { $$ = xkb_atom_intern(param->ctx, "group"); }
544 {$$ = xkb_atom_intern(param->ctx, "modifier_map");}
546 { $$ = xkb_atom_intern(param->ctx, "indicator"); }
548 { $$ = xkb_atom_intern(param->ctx, "shape"); }
550 { $$ = XKB_ATOM_NONE; }
552 { $$ = XKB_ATOM_NONE; }
554 { $$ = XKB_ATOM_NONE; }
557 OptMergeMode : MergeMode { $$ = $1; }
558 | { $$ = MERGE_DEFAULT; }
561 MergeMode : INCLUDE { $$ = MERGE_DEFAULT; }
562 | AUGMENT { $$ = MERGE_AUGMENT; }
563 | OVERRIDE { $$ = MERGE_OVERRIDE; }
564 | REPLACE { $$ = MERGE_REPLACE; }
568 * This used to be MERGE_ALT_FORM. This functionality was
569 * unused and has been removed.
575 OptExprList : ExprList { $$ = $1; }
579 ExprList : ExprList COMMA Expr
580 { $$ = (ExprDef *)AppendStmt(&$1->common, &$3->common); }
585 Expr : Expr DIVIDE Expr
586 { $$ = ExprCreateBinary(EXPR_DIVIDE, $1, $3); }
588 { $$ = ExprCreateBinary(EXPR_ADD, $1, $3); }
590 { $$ = ExprCreateBinary(EXPR_SUBTRACT, $1, $3); }
592 { $$ = ExprCreateBinary(EXPR_MULTIPLY, $1, $3); }
594 { $$ = ExprCreateBinary(EXPR_ASSIGN, $1, $3); }
600 { $$ = ExprCreateUnary(EXPR_NEGATE, $2->value_type, $2); }
602 { $$ = ExprCreateUnary(EXPR_UNARY_PLUS, $2->value_type, $2); }
604 { $$ = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, $2); }
606 { $$ = ExprCreateUnary(EXPR_INVERT, $2->value_type, $2); }
609 | FieldSpec OPAREN OptExprList CPAREN %prec OPAREN
610 { $$ = ActionCreate($1, $3); }
617 ActionList : ActionList COMMA Action
618 { $$ = (ExprDef *)AppendStmt(&$1->common, &$3->common); }
623 Action : FieldSpec OPAREN OptExprList CPAREN
624 { $$ = ActionCreate($1, $3); }
630 expr = ExprCreate(EXPR_IDENT, EXPR_TYPE_UNKNOWN);
631 expr->value.str = $1;
634 | FieldSpec DOT FieldSpec
637 expr = ExprCreate(EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN);
638 expr->value.field.element = $1;
639 expr->value.field.field = $3;
642 | FieldSpec OBRACKET Expr CBRACKET
645 expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN);
646 expr->value.array.element = XKB_ATOM_NONE;
647 expr->value.array.field = $1;
648 expr->value.array.entry = $3;
651 | FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET
654 expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN);
655 expr->value.array.element = $1;
656 expr->value.array.field = $3;
657 expr->value.array.entry = $5;
665 expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_STRING);
666 expr->value.str = $1;
672 expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_INT);
673 expr->value.ival = $1;
683 expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_KEYNAME);
684 strncpy(expr->value.keyName, $1, XKB_KEY_NAME_LENGTH);
689 OptKeySymList : KeySymList { $$ = $1; }
693 KeySymList : KeySymList COMMA KeySym
694 { $$ = AppendKeysymList($1, $3); }
695 | KeySymList COMMA KeySyms
696 { $$ = AppendMultiKeysymList($1, $3); }
698 { $$ = CreateKeysymList($1); }
700 { $$ = CreateMultiKeysymList($1); }
703 KeySyms : OBRACE KeySymList CBRACE
707 KeySym : IDENT { $$ = $1; }
708 | SECTION { $$ = strdup("section"); }
711 if ($1 < 10) { /* XK_0 .. XK_9 */
718 snprintf($$, 17, "0x%x", $1);
723 SignedNumber : MINUS Number { $$ = -$2; }
724 | Number { $$ = $1; }
727 Number : FLOAT { $$ = $1; }
728 | INTEGER { $$ = $1; }
731 Float : FLOAT { $$ = 0; }
734 Integer : INTEGER { $$ = $1; }
737 KeyCode : INTEGER { $$ = $1; }
740 KeyName : KEYNAME { strncpy($$, $1, XKB_KEY_NAME_LENGTH); }
743 Ident : IDENT { $$ = xkb_atom_steal(param->ctx, $1); }
744 | DEFAULT { $$ = xkb_atom_intern(param->ctx, "default"); }
747 String : STRING { $$ = xkb_atom_steal(param->ctx, $1); }
750 OptMapName : MapName { $$ = $1; }
754 MapName : STRING { $$ = $1; }