summaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2020-01-21 15:15:47 -0800
committerMichael Forney <mforney@mforney.org>2020-01-21 15:20:22 -0800
commitd1c3f5f5cc94c6f1d2926e9f6a3742a534f280db (patch)
treedd7e241e90a283f7114a80bed161d815c61af9b7 /pkg
parent184f709930e752d39543e4fbdfab71d948e8681b (diff)
libxkbcommon: Update to 0.10.0
Diffstat (limited to 'pkg')
-rw-r--r--pkg/libxkbcommon/config.h7
-rw-r--r--pkg/libxkbcommon/gen.lua2
-rw-r--r--pkg/libxkbcommon/patch/0001-Only-use-GCC-pragmas-with-gcc.patch40
-rw-r--r--pkg/libxkbcommon/patch/0001-Track-generated-xkbcomp-parser.patch (renamed from pkg/libxkbcommon/patch/0002-Track-generated-xkbcomp-parser.patch)1154
m---------pkg/libxkbcommon/src0
-rw-r--r--pkg/libxkbcommon/ver2
6 files changed, 593 insertions, 612 deletions
diff --git a/pkg/libxkbcommon/config.h b/pkg/libxkbcommon/config.h
index a42a55c7..a0634cfa 100644
--- a/pkg/libxkbcommon/config.h
+++ b/pkg/libxkbcommon/config.h
@@ -2,11 +2,18 @@
#define DEFAULT_XKB_MODEL "pc105"
#define DEFAULT_XKB_RULES "evdev"
#define DFLT_XKB_CONFIG_ROOT "/share/xkb"
+#define HAVE_ASPRINTF 1
#define HAVE_EACCESS 1
#define HAVE_EUIDACCESS 1
#define HAVE_MKOSTEMP 1
#define HAVE_MMAP 1
#define HAVE_POSIX_FALLOCATE 1
+#define HAVE_SECURE_GETENV 1
+#define HAVE_STRNDUP 1
#define HAVE___BUILTIN_EXPECT 1
+#define WIN32_LEAN_AND_MEAN 1
#define XLOCALEDIR "/share/xlocale"
+#define _CRT_NONSTDC_NO_DEPRECATE 1
+#define _CRT_NONSTDC_NO_WARNINGS 1
+#define _CRT_SECURE_NO_WARNINGS 1
#define _GNU_SOURCE 1
diff --git a/pkg/libxkbcommon/gen.lua b/pkg/libxkbcommon/gen.lua
index 956babb0..c2eabeae 100644
--- a/pkg/libxkbcommon/gen.lua
+++ b/pkg/libxkbcommon/gen.lua
@@ -1,5 +1,5 @@
cflags{
- '-include $dir/config.h',
+ '-I $dir',
'-I $srcdir',
'-I $srcdir/src',
}
diff --git a/pkg/libxkbcommon/patch/0001-Only-use-GCC-pragmas-with-gcc.patch b/pkg/libxkbcommon/patch/0001-Only-use-GCC-pragmas-with-gcc.patch
deleted file mode 100644
index b6ea5b3a..00000000
--- a/pkg/libxkbcommon/patch/0001-Only-use-GCC-pragmas-with-gcc.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 44da6aa9a8a91c115c22458bc7bc97d0248beaeb Mon Sep 17 00:00:00 2001
-From: Michael Forney <mforney@mforney.org>
-Date: Sat, 6 Jul 2019 01:18:59 -0700
-Subject: [PATCH] Only use GCC pragmas with gcc
-
----
- src/ks_tables.h | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/src/ks_tables.h b/src/ks_tables.h
-index a6db8de..a9f30d9 100644
---- a/src/ks_tables.h
-+++ b/src/ks_tables.h
-@@ -5,8 +5,10 @@
- * https://raw.github.com/xkbcommon/libxkbcommon/master/src/ks_tables.h
- */
-
--#pragma GCC diagnostic push
--#pragma GCC diagnostic ignored "-Woverlength-strings"
-+#ifdef __GNUC__
-+# pragma GCC diagnostic push
-+# pragma GCC diagnostic ignored "-Woverlength-strings"
-+#endif
- static const char *keysym_names =
- "0\0"
- "1\0"
-@@ -2417,7 +2419,9 @@ static const char *keysym_names =
- "Zstroke\0"
- "zstroke\0"
- ;
--#pragma GCC diagnostic pop
-+#ifdef __GNUC__
-+# pragma GCC diagnostic pop
-+#endif
-
- struct name_keysym {
- xkb_keysym_t keysym;
---
-2.22.0
-
diff --git a/pkg/libxkbcommon/patch/0002-Track-generated-xkbcomp-parser.patch b/pkg/libxkbcommon/patch/0001-Track-generated-xkbcomp-parser.patch
index 9e8dcd57..0721b2d2 100644
--- a/pkg/libxkbcommon/patch/0002-Track-generated-xkbcomp-parser.patch
+++ b/pkg/libxkbcommon/patch/0001-Track-generated-xkbcomp-parser.patch
@@ -1,13 +1,13 @@
-From 5c37bf6dce675e30d17cc41181fc81a650cfff61 Mon Sep 17 00:00:00 2001
+From 0876c7e4aaae19f5bd64129eee11687363a9d3b0 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sat, 26 Oct 2019 02:05:31 -0700
Subject: [PATCH] Track generated xkbcomp parser
---
src/xkbcomp/.gitignore | 2 -
- src/xkbcomp/parser.c | 3401 ++++++++++++++++++++++++++++++++++++++++
- src/xkbcomp/parser.h | 160 ++
- 3 files changed, 3561 insertions(+), 2 deletions(-)
+ src/xkbcomp/parser.c | 3411 ++++++++++++++++++++++++++++++++++++++++
+ src/xkbcomp/parser.h | 164 ++
+ 3 files changed, 3575 insertions(+), 2 deletions(-)
delete mode 100644 src/xkbcomp/.gitignore
create mode 100644 src/xkbcomp/parser.c
create mode 100644 src/xkbcomp/parser.h
@@ -22,11 +22,11 @@ index d7814e4..0000000
-parser.h
diff --git a/src/xkbcomp/parser.c b/src/xkbcomp/parser.c
new file mode 100644
-index 0000000..ce49e55
+index 0000000..7c38928
--- /dev/null
+++ b/src/xkbcomp/parser.c
-@@ -0,0 +1,3401 @@
-+/* A Bison parser, made by GNU Bison 3.4.1. */
+@@ -0,0 +1,3411 @@
++/* A Bison parser, made by GNU Bison 3.4.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
@@ -76,7 +76,7 @@ index 0000000..ce49e55
+#define YYBISON 1
+
+/* Bison version. */
-+#define YYBISON_VERSION "3.4.1"
++#define YYBISON_VERSION "3.4.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
@@ -102,6 +102,8 @@ index 0000000..ce49e55
+/* First part of user prologue. */
+#line 33 "../src/xkbcomp/parser.y"
+
++#include "config.h"
++
+#include "xkbcomp/xkbcomp-priv.h"
+#include "xkbcomp/ast-build.h"
+#include "xkbcomp/parser-priv.h"
@@ -152,7 +154,7 @@ index 0000000..ce49e55
+
+#define param_scanner param->scanner
+
-+#line 128 "xkbcommon@sha/parser.c"
++#line 130 "xkbcommon@sha/parser.c"
+
+# ifndef YY_NULLPTR
+# if defined __cplusplus
@@ -261,9 +263,8 @@ index 0000000..ce49e55
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
-+#line 162 "../src/xkbcomp/parser.y"
++#line 164 "../src/xkbcomp/parser.y"
+
-+ int ival;
+ int64_t num;
+ enum xkb_file_type file_type;
+ char *str;
@@ -272,9 +273,13 @@ index 0000000..ce49e55
+ enum xkb_map_flags mapFlags;
+ xkb_keysym_t keysym;
+ ParseCommon *any;
++ struct { ParseCommon *head; ParseCommon *last; } anyList;
+ ExprDef *expr;
++ struct { ExprDef *head; ExprDef *last; } exprList;
+ VarDef *var;
++ struct { VarDef *head; VarDef *last; } varList;
+ VModDef *vmod;
++ struct { VModDef *head; VModDef *last; } vmodList;
+ InterpDef *interp;
+ KeyTypeDef *keyType;
+ SymbolsDef *syms;
@@ -286,8 +291,9 @@ index 0000000..ce49e55
+ KeyAliasDef *keyAlias;
+ void *geom;
+ XkbFile *file;
++ struct { XkbFile *head; XkbFile *last; } fileList;
+
-+#line 263 "xkbcommon@sha/parser.c"
++#line 269 "xkbcommon@sha/parser.c"
+
+};
+typedef union YYSTYPE YYSTYPE;
@@ -591,25 +597,25 @@ index 0000000..ce49e55
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_uint16 yyrline[] =
+{
-+ 0, 241, 241, 243, 245, 249, 255, 256, 257, 260,
-+ 268, 272, 280, 281, 282, 283, 284, 287, 288, 291,
-+ 292, 295, 296, 297, 298, 299, 300, 301, 302, 305,
-+ 307, 310, 315, 320, 325, 330, 335, 340, 345, 350,
-+ 355, 360, 365, 366, 367, 368, 375, 377, 379, 383,
-+ 387, 391, 395, 398, 402, 404, 408, 414, 416, 420,
-+ 423, 427, 433, 439, 442, 444, 447, 448, 449, 450,
-+ 451, 454, 456, 460, 464, 468, 472, 474, 478, 480,
-+ 484, 488, 489, 492, 494, 496, 498, 500, 504, 505,
-+ 508, 509, 513, 514, 517, 519, 523, 527, 528, 531,
-+ 534, 536, 540, 542, 544, 548, 550, 554, 558, 562,
-+ 563, 564, 565, 568, 569, 572, 574, 576, 578, 580,
-+ 582, 584, 586, 588, 590, 592, 596, 597, 600, 601,
-+ 602, 603, 604, 614, 615, 618, 621, 625, 627, 629,
-+ 631, 633, 635, 639, 641, 643, 645, 647, 649, 651,
-+ 653, 657, 660, 664, 668, 670, 672, 674, 678, 680,
-+ 682, 684, 688, 689, 692, 694, 696, 698, 702, 706,
-+ 712, 713, 733, 734, 737, 738, 741, 744, 747, 750,
-+ 751, 754, 757, 758, 761
++ 0, 254, 254, 256, 258, 262, 268, 269, 270, 273,
++ 275, 279, 287, 288, 289, 290, 291, 294, 295, 298,
++ 299, 302, 303, 304, 305, 306, 307, 308, 309, 312,
++ 327, 337, 340, 346, 351, 356, 361, 366, 371, 376,
++ 381, 386, 391, 392, 393, 394, 401, 403, 405, 409,
++ 413, 417, 421, 423, 427, 429, 433, 439, 441, 445,
++ 447, 451, 457, 463, 465, 467, 470, 471, 472, 473,
++ 474, 477, 479, 483, 487, 491, 495, 497, 501, 503,
++ 507, 511, 512, 515, 517, 519, 521, 523, 527, 528,
++ 531, 532, 536, 537, 540, 542, 546, 550, 551, 554,
++ 557, 559, 563, 565, 567, 571, 573, 577, 581, 585,
++ 586, 587, 588, 591, 592, 595, 597, 599, 601, 603,
++ 605, 607, 609, 611, 613, 615, 619, 620, 623, 624,
++ 625, 626, 627, 637, 638, 641, 643, 647, 649, 651,
++ 653, 655, 657, 661, 663, 665, 667, 669, 671, 673,
++ 675, 679, 681, 685, 689, 691, 693, 695, 699, 701,
++ 703, 705, 709, 710, 713, 715, 717, 719, 723, 727,
++ 733, 734, 754, 755, 758, 759, 762, 765, 768, 771,
++ 772, 775, 778, 779, 782
+};
+#endif
+
@@ -720,11 +726,11 @@ index 0000000..ce49e55
+ 18, 4, 21, 22, 23, 24, 25, 26, 27, 28,
+ 0, 2, 3, 0, 17, 20, 1, 6, 12, 13,
+ 15, 14, 16, 7, 8, 183, 183, 19, 184, 0,
-+ 182, 0, 18, 30, 18, 10, 0, 127, 0, 9,
++ 182, 0, 18, 31, 18, 10, 0, 127, 0, 9,
+ 128, 130, 129, 131, 132, 0, 29, 0, 126, 5,
+ 11, 0, 117, 116, 115, 118, 0, 119, 120, 121,
+ 122, 123, 124, 125, 110, 111, 112, 0, 0, 179,
-+ 0, 180, 31, 34, 35, 32, 33, 36, 37, 39,
++ 0, 180, 32, 34, 35, 30, 33, 36, 37, 39,
+ 38, 40, 41, 42, 43, 44, 0, 154, 114, 0,
+ 113, 45, 0, 53, 54, 181, 0, 170, 177, 169,
+ 0, 58, 171, 0, 0, 0, 0, 0, 0, 0,
@@ -984,7 +990,7 @@ index 0000000..ce49e55
+ 0, 65, 66, 66, 66, 67, 68, 68, 68, 69,
+ 69, 70, 71, 71, 71, 71, 71, 72, 72, 73,
+ 73, 74, 74, 74, 74, 74, 74, 74, 74, 75,
-+ 75, 76, 76, 76, 76, 76, 76, 76, 76, 76,
++ 75, 75, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 77, 77, 77, 78,
+ 79, 80, 81, 81, 82, 82, 83, 84, 84, 85,
+ 85, 86, 87, 88, 88, 88, 89, 89, 89, 89,
@@ -1008,7 +1014,7 @@ index 0000000..ce49e55
+ 0, 2, 1, 1, 1, 7, 1, 1, 1, 2,
+ 1, 7, 1, 1, 1, 1, 1, 1, 0, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
-+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 3, 0, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 4, 2, 3, 4,
+ 5, 3, 3, 1, 1, 3, 6, 3, 1, 2,
+ 1, 6, 6, 3, 1, 0, 3, 3, 1, 2,
@@ -1110,7 +1116,9 @@ index 0000000..ce49e55
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
+# endif
++ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YYUSE (yytype);
++ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
@@ -1454,249 +1462,249 @@ index 0000000..ce49e55
+ switch (yytype)
+ {
+ case 52: /* STRING */
-+#line 225 "../src/xkbcomp/parser.y"
++#line 238 "../src/xkbcomp/parser.y"
+ { free(((*yyvaluep).str)); }
-+#line 1432 "xkbcommon@sha/parser.c"
++#line 1440 "xkbcommon@sha/parser.c"
+ break;
+
+ case 55: /* IDENT */
-+#line 225 "../src/xkbcomp/parser.y"
++#line 238 "../src/xkbcomp/parser.y"
+ { free(((*yyvaluep).str)); }
-+#line 1438 "xkbcommon@sha/parser.c"
++#line 1446 "xkbcommon@sha/parser.c"
+ break;
+
+ case 66: /* XkbFile */
-+#line 224 "../src/xkbcomp/parser.y"
++#line 236 "../src/xkbcomp/parser.y"
+ { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); }
-+#line 1444 "xkbcommon@sha/parser.c"
++#line 1452 "xkbcommon@sha/parser.c"
+ break;
+
+ case 67: /* XkbCompositeMap */
-+#line 224 "../src/xkbcomp/parser.y"
++#line 236 "../src/xkbcomp/parser.y"
+ { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); }
-+#line 1450 "xkbcommon@sha/parser.c"
++#line 1458 "xkbcommon@sha/parser.c"
+ break;
+
+ case 69: /* XkbMapConfigList */
-+#line 224 "../src/xkbcomp/parser.y"
-+ { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); }
-+#line 1456 "xkbcommon@sha/parser.c"
++#line 237 "../src/xkbcomp/parser.y"
++ { FreeXkbFile(((*yyvaluep).fileList).head); }
++#line 1464 "xkbcommon@sha/parser.c"
+ break;
+
+ case 70: /* XkbMapConfig */
-+#line 224 "../src/xkbcomp/parser.y"
++#line 236 "../src/xkbcomp/parser.y"
+ { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); }
-+#line 1462 "xkbcommon@sha/parser.c"
++#line 1470 "xkbcommon@sha/parser.c"
+ break;
+
+ case 75: /* DeclList */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).any)); }
-+#line 1468 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).anyList).head); }
++#line 1476 "xkbcommon@sha/parser.c"
+ break;
+
+ case 76: /* Decl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).any)); }
-+#line 1474 "xkbcommon@sha/parser.c"
++#line 1482 "xkbcommon@sha/parser.c"
+ break;
+
+ case 77: /* VarDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).var)); }
-+#line 1480 "xkbcommon@sha/parser.c"
++#line 1488 "xkbcommon@sha/parser.c"
+ break;
+
+ case 78: /* KeyNameDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).keyCode)); }
-+#line 1486 "xkbcommon@sha/parser.c"
++#line 1494 "xkbcommon@sha/parser.c"
+ break;
+
+ case 79: /* KeyAliasDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).keyAlias)); }
-+#line 1492 "xkbcommon@sha/parser.c"
++#line 1500 "xkbcommon@sha/parser.c"
+ break;
+
+ case 80: /* VModDecl */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); }
-+#line 1498 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).vmodList).head); }
++#line 1506 "xkbcommon@sha/parser.c"
+ break;
+
+ case 81: /* VModDefList */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); }
-+#line 1504 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).vmodList).head); }
++#line 1512 "xkbcommon@sha/parser.c"
+ break;
+
+ case 82: /* VModDef */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); }
-+#line 1510 "xkbcommon@sha/parser.c"
++#line 1518 "xkbcommon@sha/parser.c"
+ break;
+
+ case 83: /* InterpretDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).interp)); }
-+#line 1516 "xkbcommon@sha/parser.c"
++#line 1524 "xkbcommon@sha/parser.c"
+ break;
+
+ case 84: /* InterpretMatch */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).interp)); }
-+#line 1522 "xkbcommon@sha/parser.c"
++#line 1530 "xkbcommon@sha/parser.c"
+ break;
+
+ case 85: /* VarDeclList */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).var)); }
-+#line 1528 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).varList).head); }
++#line 1536 "xkbcommon@sha/parser.c"
+ break;
+
+ case 86: /* KeyTypeDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).keyType)); }
-+#line 1534 "xkbcommon@sha/parser.c"
++#line 1542 "xkbcommon@sha/parser.c"
+ break;
+
+ case 87: /* SymbolsDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).syms)); }
-+#line 1540 "xkbcommon@sha/parser.c"
++#line 1548 "xkbcommon@sha/parser.c"
+ break;
+
+ case 88: /* SymbolsBody */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).var)); }
-+#line 1546 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).varList).head); }
++#line 1554 "xkbcommon@sha/parser.c"
+ break;
+
+ case 89: /* SymbolsVarDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).var)); }
-+#line 1552 "xkbcommon@sha/parser.c"
++#line 1560 "xkbcommon@sha/parser.c"
+ break;
+
+ case 90: /* ArrayInit */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1558 "xkbcommon@sha/parser.c"
++#line 1566 "xkbcommon@sha/parser.c"
+ break;
+
+ case 91: /* GroupCompatDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).groupCompat)); }
-+#line 1564 "xkbcommon@sha/parser.c"
++#line 1572 "xkbcommon@sha/parser.c"
+ break;
+
+ case 92: /* ModMapDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).modMask)); }
-+#line 1570 "xkbcommon@sha/parser.c"
++#line 1578 "xkbcommon@sha/parser.c"
+ break;
+
+ case 93: /* LedMapDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).ledMap)); }
-+#line 1576 "xkbcommon@sha/parser.c"
++#line 1584 "xkbcommon@sha/parser.c"
+ break;
+
+ case 94: /* LedNameDecl */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).ledName)); }
-+#line 1582 "xkbcommon@sha/parser.c"
++#line 1590 "xkbcommon@sha/parser.c"
+ break;
+
+ case 108: /* CoordList */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1588 "xkbcommon@sha/parser.c"
++#line 1596 "xkbcommon@sha/parser.c"
+ break;
+
+ case 109: /* Coord */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1594 "xkbcommon@sha/parser.c"
++#line 1602 "xkbcommon@sha/parser.c"
+ break;
+
+ case 116: /* OptExprList */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1600 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).exprList).head); }
++#line 1608 "xkbcommon@sha/parser.c"
+ break;
+
+ case 117: /* ExprList */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1606 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).exprList).head); }
++#line 1614 "xkbcommon@sha/parser.c"
+ break;
+
+ case 118: /* Expr */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1612 "xkbcommon@sha/parser.c"
++#line 1620 "xkbcommon@sha/parser.c"
+ break;
+
+ case 119: /* Term */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1618 "xkbcommon@sha/parser.c"
++#line 1626 "xkbcommon@sha/parser.c"
+ break;
+
+ case 120: /* ActionList */
-+#line 219 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1624 "xkbcommon@sha/parser.c"
++#line 232 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) ((*yyvaluep).exprList).head); }
++#line 1632 "xkbcommon@sha/parser.c"
+ break;
+
+ case 121: /* Action */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1630 "xkbcommon@sha/parser.c"
++#line 1638 "xkbcommon@sha/parser.c"
+ break;
+
+ case 122: /* Lhs */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1636 "xkbcommon@sha/parser.c"
++#line 1644 "xkbcommon@sha/parser.c"
+ break;
+
+ case 123: /* Terminal */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1642 "xkbcommon@sha/parser.c"
++#line 1650 "xkbcommon@sha/parser.c"
+ break;
+
+ case 124: /* OptKeySymList */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1648 "xkbcommon@sha/parser.c"
++#line 1656 "xkbcommon@sha/parser.c"
+ break;
+
+ case 125: /* KeySymList */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1654 "xkbcommon@sha/parser.c"
++#line 1662 "xkbcommon@sha/parser.c"
+ break;
+
+ case 126: /* KeySyms */
-+#line 219 "../src/xkbcomp/parser.y"
++#line 229 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); }
-+#line 1660 "xkbcommon@sha/parser.c"
++#line 1668 "xkbcommon@sha/parser.c"
+ break;
+
+ case 135: /* OptMapName */
-+#line 225 "../src/xkbcomp/parser.y"
++#line 238 "../src/xkbcomp/parser.y"
+ { free(((*yyvaluep).str)); }
-+#line 1666 "xkbcommon@sha/parser.c"
++#line 1674 "xkbcommon@sha/parser.c"
+ break;
+
+ case 136: /* MapName */
-+#line 225 "../src/xkbcomp/parser.y"
++#line 238 "../src/xkbcomp/parser.y"
+ { free(((*yyvaluep).str)); }
-+#line 1672 "xkbcommon@sha/parser.c"
++#line 1680 "xkbcommon@sha/parser.c"
+ break;
+
+ default:
@@ -1964,834 +1972,838 @@ index 0000000..ce49e55
+ switch (yyn)
+ {
+ case 2:
-+#line 242 "../src/xkbcomp/parser.y"
++#line 255 "../src/xkbcomp/parser.y"
+ { (yyval.file) = param->rtrn = (yyvsp[0].file); param->more_maps = !!param->rtrn; }
-+#line 1942 "xkbcommon@sha/parser.c"
++#line 1950 "xkbcommon@sha/parser.c"
+ break;
+
+ case 3:
-+#line 244 "../src/xkbcomp/parser.y"
++#line 257 "../src/xkbcomp/parser.y"
+ { (yyval.file) = param->rtrn = (yyvsp[0].file); param->more_maps = !!param->rtrn; YYACCEPT; }
-+#line 1948 "xkbcommon@sha/parser.c"
++#line 1956 "xkbcommon@sha/parser.c"
+ break;
+
+ case 4:
-+#line 246 "../src/xkbcomp/parser.y"
++#line 259 "../src/xkbcomp/parser.y"
+ { (yyval.file) = param->rtrn = NULL; param->more_maps = false; }
-+#line 1954 "xkbcommon@sha/parser.c"
++#line 1962 "xkbcommon@sha/parser.c"
+ break;
+
+ case 5:
-+#line 252 "../src/xkbcomp/parser.y"
-+ { (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (ParseCommon *) (yyvsp[-2].file), (yyvsp[-6].mapFlags)); }
-+#line 1960 "xkbcommon@sha/parser.c"
++#line 265 "../src/xkbcomp/parser.y"
++ { (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (ParseCommon *) (yyvsp[-2].fileList).head, (yyvsp[-6].mapFlags)); }
++#line 1968 "xkbcommon@sha/parser.c"
+ break;
+
+ case 6:
-+#line 255 "../src/xkbcomp/parser.y"
++#line 268 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_KEYMAP; }
-+#line 1966 "xkbcommon@sha/parser.c"
++#line 1974 "xkbcommon@sha/parser.c"
+ break;
+
+ case 7:
-+#line 256 "../src/xkbcomp/parser.y"
++#line 269 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_KEYMAP; }
-+#line 1972 "xkbcommon@sha/parser.c"
++#line 1980 "xkbcommon@sha/parser.c"
+ break;
+
+ case 8:
-+#line 257 "../src/xkbcomp/parser.y"
++#line 270 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_KEYMAP; }
-+#line 1978 "xkbcommon@sha/parser.c"
++#line 1986 "xkbcommon@sha/parser.c"
+ break;
+
+ case 9:
-+#line 261 "../src/xkbcomp/parser.y"
-+ {
-+ if (!(yyvsp[0].file))
-+ (yyval.file) = (yyvsp[-1].file);
-+ else
-+ (yyval.file) = (XkbFile *) AppendStmt((ParseCommon *) (yyvsp[-1].file),
-+ (ParseCommon *) (yyvsp[0].file));
-+ }
-+#line 1990 "xkbcommon@sha/parser.c"
++#line 274 "../src/xkbcomp/parser.y"
++ { (yyval.fileList).head = (yyvsp[-1].fileList).head; (yyval.fileList).last->common.next = &(yyvsp[0].file)->common; (yyval.fileList).last = (yyvsp[0].file); }
++#line 1992 "xkbcommon@sha/parser.c"
+ break;
+
+ case 10:
-+#line 269 "../src/xkbcomp/parser.y"
-+ { (yyval.file) = (yyvsp[0].file); }
-+#line 1996 "xkbcommon@sha/parser.c"
++#line 276 "../src/xkbcomp/parser.y"
++ { (yyval.fileList).head = (yyval.fileList).last = (yyvsp[0].file); }
++#line 1998 "xkbcommon@sha/parser.c"
+ break;
+
+ case 11:
-+#line 275 "../src/xkbcomp/parser.y"
++#line 282 "../src/xkbcomp/parser.y"
+ {
-+ (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (yyvsp[-2].any), (yyvsp[-6].mapFlags));
++ (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (yyvsp[-2].anyList).head, (yyvsp[-6].mapFlags));
+ }
-+#line 2004 "xkbcommon@sha/parser.c"
++#line 2006 "xkbcommon@sha/parser.c"
+ break;
+
+ case 12:
-+#line 280 "../src/xkbcomp/parser.y"
++#line 287 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_KEYCODES; }
-+#line 2010 "xkbcommon@sha/parser.c"
++#line 2012 "xkbcommon@sha/parser.c"
+ break;
+
+ case 13:
-+#line 281 "../src/xkbcomp/parser.y"
++#line 288 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_TYPES; }
-+#line 2016 "xkbcommon@sha/parser.c"
++#line 2018 "xkbcommon@sha/parser.c"
+ break;
+
+ case 14:
-+#line 282 "../src/xkbcomp/parser.y"
++#line 289 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_COMPAT; }
-+#line 2022 "xkbcommon@sha/parser.c"
++#line 2024 "xkbcommon@sha/parser.c"
+ break;
+
+ case 15:
-+#line 283 "../src/xkbcomp/parser.y"
++#line 290 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_SYMBOLS; }
-+#line 2028 "xkbcommon@sha/parser.c"
++#line 2030 "xkbcommon@sha/parser.c"
+ break;
+
+ case 16:
-+#line 284 "../src/xkbcomp/parser.y"
++#line 291 "../src/xkbcomp/parser.y"
+ { (yyval.file_type) = FILE_TYPE_GEOMETRY; }
-+#line 2034 "xkbcommon@sha/parser.c"
++#line 2036 "xkbcommon@sha/parser.c"
+ break;
+
+ case 17:
-+#line 287 "../src/xkbcomp/parser.y"
++#line 294 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = (yyvsp[0].mapFlags); }
-+#line 2040 "xkbcommon@sha/parser.c"
++#line 2042 "xkbcommon@sha/parser.c"
+ break;
+
+ case 18:
-+#line 288 "../src/xkbcomp/parser.y"
++#line 295 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = 0; }
-+#line 2046 "xkbcommon@sha/parser.c"
++#line 2048 "xkbcommon@sha/parser.c"
+ break;
+
+ case 19:
-+#line 291 "../src/xkbcomp/parser.y"
++#line 298 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = ((yyvsp[-1].mapFlags) | (yyvsp[0].mapFlags)); }
-+#line 2052 "xkbcommon@sha/parser.c"
++#line 2054 "xkbcommon@sha/parser.c"
+ break;
+
+ case 20:
-+#line 292 "../src/xkbcomp/parser.y"
++#line 299 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = (yyvsp[0].mapFlags); }
-+#line 2058 "xkbcommon@sha/parser.c"
++#line 2060 "xkbcommon@sha/parser.c"
+ break;
+
+ case 21:
-+#line 295 "../src/xkbcomp/parser.y"
++#line 302 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_IS_PARTIAL; }
-+#line 2064 "xkbcommon@sha/parser.c"
++#line 2066 "xkbcommon@sha/parser.c"
+ break;
+
+ case 22:
-+#line 296 "../src/xkbcomp/parser.y"
++#line 303 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_IS_DEFAULT; }
-+#line 2070 "xkbcommon@sha/parser.c"
++#line 2072 "xkbcommon@sha/parser.c"
+ break;
+
+ case 23:
-+#line 297 "../src/xkbcomp/parser.y"
++#line 304 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_IS_HIDDEN; }
-+#line 2076 "xkbcommon@sha/parser.c"
++#line 2078 "xkbcommon@sha/parser.c"
+ break;
+
+ case 24:
-+#line 298 "../src/xkbcomp/parser.y"
++#line 305 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_HAS_ALPHANUMERIC; }
-+#line 2082 "xkbcommon@sha/parser.c"
++#line 2084 "xkbcommon@sha/parser.c"
+ break;
+
+ case 25:
-+#line 299 "../src/xkbcomp/parser.y"
++#line 306 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_HAS_MODIFIER; }
-+#line 2088 "xkbcommon@sha/parser.c"
++#line 2090 "xkbcommon@sha/parser.c"
+ break;
+
+ case 26:
-+#line 300 "../src/xkbcomp/parser.y"
++#line 307 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_HAS_KEYPAD; }
-+#line 2094 "xkbcommon@sha/parser.c"
++#line 2096 "xkbcommon@sha/parser.c"
+ break;
+
+ case 27:
-+#line 301 "../src/xkbcomp/parser.y"
++#line 308 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_HAS_FN; }
-+#line 2100 "xkbcommon@sha/parser.c"
++#line 2102 "xkbcommon@sha/parser.c"
+ break;
+
+ case 28:
-+#line 302 "../src/xkbcomp/parser.y"
++#line 309 "../src/xkbcomp/parser.y"
+ { (yyval.mapFlags) = MAP_IS_ALTGR; }
-+#line 2106 "xkbcommon@sha/parser.c"
++#line 2108 "xkbcommon@sha/parser.c"
+ break;
+
+ case 29:
-+#line 306 "../src/xkbcomp/parser.y"
-+ { (yyval.any) = AppendStmt((yyvsp[-1].any), (yyvsp[0].any)); }
-+#line 2112 "xkbcommon@sha/parser.c"
++#line 313 "../src/xkbcomp/parser.y"
++ {
++ if ((yyvsp[0].any)) {
++ if ((yyvsp[-1].anyList).head) {
++ (yyval.anyList).head = (yyvsp[-1].anyList).head; (yyvsp[-1].anyList).last->next = (yyvsp[0].any); (yyval.anyList).last = (yyvsp[0].any);
++ } else {
++ (yyval.anyList).head = (yyval.anyList).last = (yyvsp[0].any);
++ }
++ }
++ }
++#line 2122 "xkbcommon@sha/parser.c"
+ break;
+
+ case 30:
-+#line 307 "../src/xkbcomp/parser.y"
-+ { (yyval.any) = NULL; }
-+#line 2118 "xkbcommon@sha/parser.c"
++#line 328 "../src/xkbcomp/parser.y"
++ {
++ for (VModDef *vmod = (yyvsp[0].vmodList).head; vmod; vmod = (VModDef *) vmod->common.next)
++ vmod->merge = (yyvsp[-1].merge);
++ if ((yyvsp[-2].anyList).head) {
++ (yyval.anyList).head = (yyvsp[-2].anyList).head; (yyvsp[-2].anyList).last->next = &(yyvsp[0].vmodList).head->common; (yyval.anyList).last = &(yyvsp[0].vmodList).last->common;
++ } else {
++ (yyval.anyList).head = &(yyvsp[0].vmodList).head->common; (yyval.anyList).last = &(yyvsp[0].vmodList).last->common;
++ }
++ }
++#line 2136 "xkbcommon@sha/parser.c"
+ break;
+
+ case 31:
-+#line 311 "../src/xkbcomp/parser.y"
-+ {
-+ (yyvsp[0].var)->merge = (yyvsp[-1].merge);
-+ (yyval.any) = (ParseCommon *) (yyvsp[0].var);
-+ }
-+#line 2127 "xkbcommon@sha/parser.c"
++#line 337 "../src/xkbcomp/parser.y"
++ { (yyval.anyList).head = (yyval.anyList).last = NULL; }
++#line 2142 "xkbcommon@sha/parser.c"
+ break;
+
+ case 32:
-+#line 316 "../src/xkbcomp/parser.y"
++#line 341 "../src/xkbcomp/parser.y"
+ {
-+ (yyvsp[0].vmod)->merge = (yyvsp[-1].merge);
-+ (yyval.any) = (ParseCommon *) (yyvsp[0].vmod);
++ (yyvsp[0].var)->merge = (yyvsp[-1].merge);
++ (yyval.any) = (ParseCommon *) (yyvsp[0].var);
+ }
-+#line 2136 "xkbcommon@sha/parser.c"
++#line 2151 "xkbcommon@sha/parser.c"
+ break;
+
+ case 33:
-+#line 321 "../src/xkbcomp/parser.y"
++#line 347 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].interp)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].interp);
+ }
-+#line 2145 "xkbcommon@sha/parser.c"
++#line 2160 "xkbcommon@sha/parser.c"
+ break;
+
+ case 34:
-+#line 326 "../src/xkbcomp/parser.y"
++#line 352 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].keyCode)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].keyCode);
+ }
-+#line 2154 "xkbcommon@sha/parser.c"
++#line 2169 "xkbcommon@sha/parser.c"
+ break;
+
+ case 35:
-+#line 331 "../src/xkbcomp/parser.y"
++#line 357 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].keyAlias)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].keyAlias);
+ }
-+#line 2163 "xkbcommon@sha/parser.c"
++#line 2178 "xkbcommon@sha/parser.c"
+ break;
+
+ case 36:
-+#line 336 "../src/xkbcomp/parser.y"
++#line 362 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].keyType)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].keyType);
+ }
-+#line 2172 "xkbcommon@sha/parser.c"
++#line 2187 "xkbcommon@sha/parser.c"
+ break;
+
+ case 37:
-+#line 341 "../src/xkbcomp/parser.y"
++#line 367 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].syms)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].syms);
+ }
-+#line 2181 "xkbcommon@sha/parser.c"
++#line 2196 "xkbcommon@sha/parser.c"
+ break;
+
+ case 38:
-+#line 346 "../src/xkbcomp/parser.y"
++#line 372 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].modMask)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].modMask);
+ }
-+#line 2190 "xkbcommon@sha/parser.c"
++#line 2205 "xkbcommon@sha/parser.c"
+ break;
+
+ case 39:
-+#line 351 "../src/xkbcomp/parser.y"
++#line 377 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].groupCompat)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].groupCompat);
+ }
-+#line 2199 "xkbcommon@sha/parser.c"
++#line 2214 "xkbcommon@sha/parser.c"
+ break;
+
+ case 40:
-+#line 356 "../src/xkbcomp/parser.y"
++#line 382 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].ledMap)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].ledMap);
+ }
-+#line 2208 "xkbcommon@sha/parser.c"
++#line 2223 "xkbcommon@sha/parser.c"
+ break;
+
+ case 41:
-+#line 361 "../src/xkbcomp/parser.y"
++#line 387 "../src/xkbcomp/parser.y"
+ {
+ (yyvsp[0].ledName)->merge = (yyvsp[-1].merge);
+ (yyval.any) = (ParseCommon *) (yyvsp[0].ledName);
+ }
-+#line 2217 "xkbcommon@sha/parser.c"
++#line 2232 "xkbcommon@sha/parser.c"
+ break;
+
+ case 42:
-+#line 365 "../src/xkbcomp/parser.y"
++#line 391 "../src/xkbcomp/parser.y"
+ { (yyval.any) = NULL; }
-+#line 2223 "xkbcommon@sha/parser.c"
++#line 2238 "xkbcommon@sha/parser.c"
+ break;
+
+ case 43:
-+#line 366 "../src/xkbcomp/parser.y"
++#line 392 "../src/xkbcomp/parser.y"
+ { (yyval.any) = NULL; }
-+#line 2229 "xkbcommon@sha/parser.c"
++#line 2244 "xkbcommon@sha/parser.c"
+ break;
+
+ case 44:
-+#line 367 "../src/xkbcomp/parser.y"
++#line 393 "../src/xkbcomp/parser.y"
+ { (yyval.any) = NULL; }
-+#line 2235 "xkbcommon@sha/parser.c"
++#line 2250 "xkbcommon@sha/parser.c"
+ break;
+
+ case 45:
-+#line 369 "../src/xkbcomp/parser.y"
++#line 395 "../src/xkbcomp/parser.y"
+ {
+ (yyval.any) = (ParseCommon *) IncludeCreate(param->ctx, (yyvsp[0].str), (yyvsp[-1].merge));
+ free((yyvsp[0].str));
+ }
-+#line 2244 "xkbcommon@sha/parser.c"
++#line 2259 "xkbcommon@sha/parser.c"
+ break;
+
+ case 46:
-+#line 376 "../src/xkbcomp/parser.y"
++#line 402 "../src/xkbcomp/parser.y"
+ { (yyval.var) = VarCreate((yyvsp[-3].expr), (yyvsp[-1].expr)); }
-+#line 2250 "xkbcommon@sha/parser.c"
++#line 2265 "xkbcommon@sha/parser.c"
+ break;
+
+ case 47:
-+#line 378 "../src/xkbcomp/parser.y"
++#line 404 "../src/xkbcomp/parser.y"
+ { (yyval.var) = BoolVarCreate((yyvsp[-1].atom), true); }
-+#line 2256 "xkbcommon@sha/parser.c"
++#line 2271 "xkbcommon@sha/parser.c"
+ break;
+
+ case 48:
-+#line 380 "../src/xkbcomp/parser.y"
++#line 406 "../src/xkbcomp/parser.y"
+ { (yyval.var) = BoolVarCreate((yyvsp[-1].atom), false); }
-+#line 2262 "xkbcommon@sha/parser.c"
++#line 2277 "xkbcommon@sha/parser.c"
+ break;
+
+ case 49:
-+#line 384 "../src/xkbcomp/parser.y"
++#line 410 "../src/xkbcomp/parser.y"
+ { (yyval.keyCode) = KeycodeCreate((yyvsp[-3].atom), (yyvsp[-1].num)); }
-+#line 2268 "xkbcommon@sha/parser.c"
++#line 2283 "xkbcommon@sha/parser.c"
+ break;
+
+ case 50:
-+#line 388 "../src/xkbcomp/parser.y"
++#line 414 "../src/xkbcomp/parser.y"
+ { (yyval.keyAlias) = KeyAliasCreate((yyvsp[-3].atom), (yyvsp[-1].atom)); }
-+#line 2274 "xkbcommon@sha/parser.c"
++#line 2289 "xkbcommon@sha/parser.c"
+ break;
+
+ case 51:
-+#line 392 "../src/xkbcomp/parser.y"
-+ { (yyval.vmod) = (yyvsp[-1].vmod); }
-+#line 2280 "xkbcommon@sha/parser.c"
++#line 418 "../src/xkbcomp/parser.y"
++ { (yyval.vmodList) = (yyvsp[-1].vmodList); }
++#line 2295 "xkbcommon@sha/parser.c"
+ break;
+
+ case 52:
-+#line 396 "../src/xkbcomp/parser.y"
-+ { (yyval.vmod) = (VModDef *) AppendStmt((ParseCommon *) (yyvsp[-2].vmod),
-+ (ParseCommon *) (yyvsp[0].vmod)); }
-+#line 2287 "xkbcommon@sha/parser.c"
++#line 422 "../src/xkbcomp/parser.y"
++ { (yyval.vmodList).head = (yyvsp[-2].vmodList).head; (yyval.vmodList).last->common.next = &(yyvsp[0].vmod)->common; (yyval.vmodList).last = (yyvsp[0].vmod); }
++#line 2301 "xkbcommon@sha/parser.c"
+ break;
+
+ case 53:
-+#line 399 "../src/xkbcomp/parser.y"
-+ { (yyval.vmod) = (yyvsp[0].vmod); }
-+#line 2293 "xkbcommon@sha/parser.c"
++#line 424 "../src/xkbcomp/parser.y"
++ { (yyval.vmodList).head = (yyval.vmodList).last = (yyvsp[0].vmod); }
++#line 2307 "xkbcommon@sha/parser.c"
+ break;
+
+ case 54:
-+#line 403 "../src/xkbcomp/parser.y"
++#line 428 "../src/xkbcomp/parser.y"
+ { (yyval.vmod) = VModCreate((yyvsp[0].atom), NULL); }
-+#line 2299 "xkbcommon@sha/parser.c"
++#line 2313 "xkbcommon@sha/parser.c"
+ break;
+
+ case 55:
-+#line 405 "../src/xkbcomp/parser.y"
++#line 430 "../src/xkbcomp/parser.y"
+ { (yyval.vmod) = VModCreate((yyvsp[-2].atom), (yyvsp[0].expr)); }
-+#line 2305 "xkbcommon@sha/parser.c"
++#line 2319 "xkbcommon@sha/parser.c"
+ break;
+
+ case 56:
-+#line 411 "../src/xkbcomp/parser.y"
-+ { (yyvsp[-4].interp)->def = (yyvsp[-2].var); (yyval.interp) = (yyvsp[-4].interp); }
-+#line 2311 "xkbcommon@sha/parser.c"
++#line 436 "../src/xkbcomp/parser.y"
++ { (yyvsp[-4].interp)->def = (yyvsp[-2].varList).head; (yyval.interp) = (yyvsp[-4].interp); }
++#line 2325 "xkbcommon@sha/parser.c"
+ break;
+
+ case 57:
-+#line 415 "../src/xkbcomp/parser.y"
++#line 440 "../src/xkbcomp/parser.y"
+ { (yyval.interp) = InterpCreate((yyvsp[-2].keysym), (yyvsp[0].expr)); }
-+#line 2317 "xkbcommon@sha/parser.c"
++#line 2331 "xkbcommon@sha/parser.c"
+ break;
+
+ case 58:
-+#line 417 "../src/xkbcomp/parser.y"
++#line 442 "../src/xkbcomp/parser.y"
+ { (yyval.interp) = InterpCreate((yyvsp[0].keysym), NULL); }
-+#line 2323 "xkbcommon@sha/parser.c"
++#line 2337 "xkbcommon@sha/parser.c"
+ break;
+
+ case 59:
-+#line 421 "../src/xkbcomp/parser.y"
-+ { (yyval.var) = (VarDef *) AppendStmt((ParseCommon *) (yyvsp[-1].var),
-+ (ParseCommon *) (yyvsp[0].var)); }
-+#line 2330 "xkbcommon@sha/parser.c"
++#line 446 "../src/xkbcomp/parser.y"
++ { (yyval.varList).head = (yyvsp[-1].varList).head; (yyval.varList).last->common.next = &(yyvsp[0].var)->common; (yyval.varList).last = (yyvsp[0].var); }
++#line 2343 "xkbcommon@sha/parser.c"
+ break;
+
+ case 60:
-+#line 424 "../src/xkbcomp/parser.y"
-+ { (yyval.var) = (yyvsp[0].var); }
-+#line 2336 "xkbcommon@sha/parser.c"
++#line 448 "../src/xkbcomp/parser.y"
++ { (yyval.varList).head = (yyval.varList).last = (yyvsp[0].var); }
++#line 2349 "xkbcommon@sha/parser.c"
+ break;
+
+ case 61:
-+#line 430 "../src/xkbcomp/parser.y"
-+ { (yyval.keyType) = KeyTypeCreate((yyvsp[-4].atom), (yyvsp[-2].var)); }
-+#line 2342 "xkbcommon@sha/parser.c"
++#line 454 "../src/xkbcomp/parser.y"
++ { (yyval.keyType) = KeyTypeCreate((yyvsp[-4].atom), (yyvsp[-2].varList).head); }
++#line 2355 "xkbcommon@sha/parser.c"
+ break;
+
+ case 62:
-+#line 436 "../src/xkbcomp/parser.y"
-+ { (yyval.syms) = SymbolsCreate((yyvsp[-4].atom), (yyvsp[-2].var)); }
-+#line 2348 "xkbcommon@sha/parser.c"
++#line 460 "../src/xkbcomp/parser.y"
++ { (yyval.syms) = SymbolsCreate((yyvsp[-4].atom), (yyvsp[-2].varList).head); }
++#line 2361 "xkbcommon@sha/parser.c"
+ break;
+
+ case 63:
-+#line 440 "../src/xkbcomp/parser.y"
-+ { (yyval.var) = (VarDef *) AppendStmt((ParseCommon *) (yyvsp[-2].var),
-+ (ParseCommon *) (yyvsp[0].var)); }
-+#line 2355 "xkbcommon@sha/parser.c"
++#line 464 "../src/xkbcomp/parser.y"
++ { (yyval.varList).head = (yyvsp[-2].varList).head; (yyval.varList).last->common.next = &(yyvsp[0].var)->common; (yyval.varList).last = (yyvsp[0].var); }
++#line 2367 "xkbcommon@sha/parser.c"
+ break;
+
+ case 64:
-+#line 443 "../src/xkbcomp/parser.y"
-+ { (yyval.var) = (yyvsp[0].var); }
-+#line 2361 "xkbcommon@sha/parser.c"
++#line 466 "../src/xkbcomp/parser.y"
++ { (yyval.varList).head = (yyval.varList).last = (yyvsp[0].var); }
++#line 2373 "xkbcommon@sha/parser.c"
+ break;
+
+ case 65:
-+#line 444 "../src/xkbcomp/parser.y"
-+ { (yyval.var) = NULL; }
-+#line 2367 "xkbcommon@sha/parser.c"
++#line 467 "../src/xkbcomp/parser.y"
++ { (yyval.varList).head = (yyval.varList).last = NULL; }
++#line 2379 "xkbcommon@sha/parser.c"
+ break;
+
+ case 66:
-+#line 447 "../src/xkbcomp/parser.y"
++#line 470 "../src/xkbcomp/parser.y"
+ { (yyval.var) = VarCreate((yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2373 "xkbcommon@sha/parser.c"
++#line 2385 "xkbcommon@sha/parser.c"
+ break;
+
+ case 67:
-+#line 448 "../src/xkbcomp/parser.y"
++#line 471 "../src/xkbcomp/parser.y"
+ { (yyval.var) = VarCreate((yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2379 "xkbcommon@sha/parser.c"
++#line 2391 "xkbcommon@sha/parser.c"
+ break;
+
+ case 68:
-+#line 449 "../src/xkbcomp/parser.y"
++#line 472 "../src/xkbcomp/parser.y"
+ { (yyval.var) = BoolVarCreate((yyvsp[0].atom), true); }
-+#line 2385 "xkbcommon@sha/parser.c"
++#line 2397 "xkbcommon@sha/parser.c"
+ break;
+
+ case 69:
-+#line 450 "../src/xkbcomp/parser.y"
++#line 473 "../src/xkbcomp/parser.y"
+ { (yyval.var) = BoolVarCreate((yyvsp[0].atom), false); }
-+#line 2391 "xkbcommon@sha/parser.c"
++#line 2403 "xkbcommon@sha/parser.c"
+ break;
+
+ case 70:
-+#line 451 "../src/xkbcomp/parser.y"
++#line 474 "../src/xkbcomp/parser.y"
+ { (yyval.var) = VarCreate(NULL, (yyvsp[0].expr)); }
-+#line 2397 "xkbcommon@sha/parser.c"
++#line 2409 "xkbcommon@sha/parser.c"
+ break;
+
+ case 71:
-+#line 455 "../src/xkbcomp/parser.y"
++#line 478 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
-+#line 2403 "xkbcommon@sha/parser.c"
++#line 2415 "xkbcommon@sha/parser.c"
+ break;
+
+ case 72:
-+#line 457 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = ExprCreateUnary(EXPR_ACTION_LIST, EXPR_TYPE_ACTION, (yyvsp[-1].expr)); }
-+#line 2409 "xkbcommon@sha/parser.c"
++#line 480 "../src/xkbcomp/parser.y"
++ { (yyval.expr) = ExprCreateActionList((yyvsp[-1].exprList).head); }
++#line 2421 "xkbcommon@sha/parser.c"
+ break;
+
+ case 73:
-+#line 461 "../src/xkbcomp/parser.y"
-+ { (yyval.groupCompat) = GroupCompatCreate((yyvsp[-3].ival), (yyvsp[-1].expr)); }
-+#line 2415 "xkbcommon@sha/parser.c"
++#line 484 "../src/xkbcomp/parser.y"
++ { (yyval.groupCompat) = GroupCompatCreate((yyvsp[-3].num), (yyvsp[-1].expr)); }
++#line 2427 "xkbcommon@sha/parser.c"
+ break;
+
+ case 74:
-+#line 465 "../src/xkbcomp/parser.y"
-+ { (yyval.modMask) = ModMapCreate((yyvsp[-4].atom), (yyvsp[-2].expr)); }
-+#line 2421 "xkbcommon@sha/parser.c"
++#line 488 "../src/xkbcomp/parser.y"
++ { (yyval.modMask) = ModMapCreate((yyvsp[-4].atom), (yyvsp[-2].exprList).head); }
++#line 2433 "xkbcommon@sha/parser.c"
+ break;
+
+ case 75:
-+#line 469 "../src/xkbcomp/parser.y"
-+ { (yyval.ledMap) = LedMapCreate((yyvsp[-4].atom), (yyvsp[-2].var)); }
-+#line 2427 "xkbcommon@sha/parser.c"
++#line 492 "../src/xkbcomp/parser.y"
++ { (yyval.ledMap) = LedMapCreate((yyvsp[-4].atom), (yyvsp[-2].varList).head); }
++#line 2439 "xkbcommon@sha/parser.c"
+ break;
+
+ case 76:
-+#line 473 "../src/xkbcomp/parser.y"
-+ { (yyval.ledName) = LedNameCreate((yyvsp[-3].ival), (yyvsp[-1].expr), false); }
-+#line 2433 "xkbcommon@sha/parser.c"
++#line 496 "../src/xkbcomp/parser.y"
++ { (yyval.ledName) = LedNameCreate((yyvsp[-3].num), (yyvsp[-1].expr), false); }
++#line 2445 "xkbcommon@sha/parser.c"
+ break;
+
+ case 77:
-+#line 475 "../src/xkbcomp/parser.y"
-+ { (yyval.ledName) = LedNameCreate((yyvsp[-3].ival), (yyvsp[-1].expr), true); }
-+#line 2439 "xkbcommon@sha/parser.c"
++#line 498 "../src/xkbcomp/parser.y"
++ { (yyval.ledName) = LedNameCreate((yyvsp[-3].num), (yyvsp[-1].expr), true); }
++#line 2451 "xkbcommon@sha/parser.c"
+ break;
+
+ case 78:
-+#line 479 "../src/xkbcomp/parser.y"
++#line 502 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2445 "xkbcommon@sha/parser.c"
++#line 2457 "xkbcommon@sha/parser.c"
+ break;
+
+ case 79:
-+#line 481 "../src/xkbcomp/parser.y"
++#line 504 "../src/xkbcomp/parser.y"
+ { (void) (yyvsp[-2].expr); (yyval.geom) = NULL; }
-+#line 2451 "xkbcommon@sha/parser.c"
++#line 2463 "xkbcommon@sha/parser.c"
+ break;
+
+ case 80:
-+#line 485 "../src/xkbcomp/parser.y"
++#line 508 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2457 "xkbcommon@sha/parser.c"
++#line 2469 "xkbcommon@sha/parser.c"
+ break;
+
+ case 81:
-+#line 488 "../src/xkbcomp/parser.y"
++#line 511 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL;}
-+#line 2463 "xkbcommon@sha/parser.c"
++#line 2475 "xkbcommon@sha/parser.c"
+ break;
+
+ case 82:
-+#line 489 "../src/xkbcomp/parser.y"
++#line 512 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2469 "xkbcommon@sha/parser.c"
++#line 2481 "xkbcommon@sha/parser.c"
+ break;
+
+ case 83:
-+#line 493 "../src/xkbcomp/parser.y"
++#line 516 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2475 "xkbcommon@sha/parser.c"
++#line 2487 "xkbcommon@sha/parser.c"
+ break;
+
+ case 84:
-+#line 495 "../src/xkbcomp/parser.y"
++#line 518 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) (yyvsp[0].var)); (yyval.geom) = NULL; }
-+#line 2481 "xkbcommon@sha/parser.c"
++#line 2493 "xkbcommon@sha/parser.c"
+ break;
+
+ case 85:
-+#line 497 "../src/xkbcomp/parser.y"
++#line 520 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2487 "xkbcommon@sha/parser.c"
++#line 2499 "xkbcommon@sha/parser.c"
+ break;
+
+ case 86:
-+#line 499 "../src/xkbcomp/parser.y"
++#line 522 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) (yyvsp[0].ledMap)); (yyval.geom) = NULL; }
-+#line 2493 "xkbcommon@sha/parser.c"
++#line 2505 "xkbcommon@sha/parser.c"
+ break;
+
+ case 87:
-+#line 501 "../src/xkbcomp/parser.y"
++#line 524 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2499 "xkbcommon@sha/parser.c"
++#line 2511 "xkbcommon@sha/parser.c"
+ break;
+
+ case 88:
-+#line 504 "../src/xkbcomp/parser.y"
++#line 527 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL;}
-+#line 2505 "xkbcommon@sha/parser.c"
++#line 2517 "xkbcommon@sha/parser.c"
+ break;
+
+ case 89:
-+#line 505 "../src/xkbcomp/parser.y"
++#line 528 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2511 "xkbcommon@sha/parser.c"
++#line 2523 "xkbcommon@sha/parser.c"
+ break;
+
+ case 90:
-+#line 508 "../src/xkbcomp/parser.y"
++#line 531 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2517 "xkbcommon@sha/parser.c"
++#line 2529 "xkbcommon@sha/parser.c"
+ break;
+
+ case 91:
-+#line 510 "../src/xkbcomp/parser.y"
++#line 533 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) (yyvsp[0].var)); (yyval.geom) = NULL; }
-+#line 2523 "xkbcommon@sha/parser.c"
++#line 2535 "xkbcommon@sha/parser.c"
+ break;
+
+ case 92:
-+#line 513 "../src/xkbcomp/parser.y"
++#line 536 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2529 "xkbcommon@sha/parser.c"
++#line 2541 "xkbcommon@sha/parser.c"
+ break;
+
+ case 93:
-+#line 514 "../src/xkbcomp/parser.y"
++#line 537 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2535 "xkbcommon@sha/parser.c"
++#line 2547 "xkbcommon@sha/parser.c"
+ break;
+
+ case 94:
-+#line 518 "../src/xkbcomp/parser.y"
++#line 541 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2541 "xkbcommon@sha/parser.c"
++#line 2553 "xkbcommon@sha/parser.c"
+ break;
+
+ case 95:
-+#line 520 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) (yyvsp[-1].expr)); (yyval.geom) = NULL; }
-+#line 2547 "xkbcommon@sha/parser.c"
++#line 543 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) (yyvsp[-1].exprList).head); (yyval.geom) = NULL; }
++#line 2559 "xkbcommon@sha/parser.c"
+ break;
+
+ case 96:
-+#line 524 "../src/xkbcomp/parser.y"
++#line 547 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2553 "xkbcommon@sha/parser.c"
++#line 2565 "xkbcommon@sha/parser.c"
+ break;
+
+ case 97:
-+#line 527 "../src/xkbcomp/parser.y"
++#line 550 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2559 "xkbcommon@sha/parser.c"
++#line 2571 "xkbcommon@sha/parser.c"
+ break;
+
+ case 98:
-+#line 528 "../src/xkbcomp/parser.y"
++#line 551 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2565 "xkbcommon@sha/parser.c"
++#line 2577 "xkbcommon@sha/parser.c"
+ break;
+
+ case 99:
-+#line 531 "../src/xkbcomp/parser.y"
++#line 554 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2571 "xkbcommon@sha/parser.c"
++#line 2583 "xkbcommon@sha/parser.c"
+ break;
+
+ case 100:
-+#line 535 "../src/xkbcomp/parser.y"
++#line 558 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL;}
-+#line 2577 "xkbcommon@sha/parser.c"
++#line 2589 "xkbcommon@sha/parser.c"
+ break;
+
+ case 101:
-+#line 537 "../src/xkbcomp/parser.y"
++#line 560 "../src/xkbcomp/parser.y"
+ { (yyval.geom) = NULL; }
-+#line 2583 "xkbcommon@sha/parser.c"
++#line 2595 "xkbcommon@sha/parser.c"
+ break;
+
+ case 102:
-+#line 541 "../src/xkbcomp/parser.y"
++#line 564 "../src/xkbcomp/parser.y"
+ { (void) (yyvsp[-1].expr); (yyval.geom) = NULL; }
-+#line 2589 "xkbcommon@sha/parser.c"
++#line 2601 "xkbcommon@sha/parser.c"
+ break;
+
+ case 103:
-+#line 543 "../src/xkbcomp/parser.y"
++#line 566 "../src/xkbcomp/parser.y"
+ { (void) (yyvsp[-1].expr); (yyval.geom) = NULL; }
-+#line 2595 "xkbcommon@sha/parser.c"
++#line 2607 "xkbcommon@sha/parser.c"
+ break;
+
+ case 104:
-+#line 545 "../src/xkbcomp/parser.y"
++#line 568 "../src/xkbcomp/parser.y"
+ { FreeStmt((ParseCommon *) (yyvsp[0].expr)); (yyval.geom) = NULL; }
-+#line 2601 "xkbcommon@sha/parser.c"
++#line 2613 "xkbcommon@sha/parser.c"
+ break;
+
+ case 105:
-+#line 549 "../src/xkbcomp/parser.y"
++#line 572 "../src/xkbcomp/parser.y"
+ { (void) (yyvsp[-2].expr); (void) (yyvsp[0].expr); (yyval.expr) = NULL; }
-+#line 2607 "xkbcommon@sha/parser.c"
++#line 2619 "xkbcommon@sha/parser.c"
+ break;
+
+ case 106:
-+#line 551 "../src/xkbcomp/parser.y"
++#line 574 "../src/xkbcomp/parser.y"
+ { (void) (yyvsp[0].expr); (yyval.expr) = NULL; }
-+#line 2613 "xkbcommon@sha/parser.c"
++#line 2625 "xkbcommon@sha/parser.c"
+ break;
+
+ case 107:
-+#line 555 "../src/xkbcomp/parser.y"
++#line 578 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = NULL; }
-+#line 2619 "xkbcommon@sha/parser.c"
++#line 2631 "xkbcommon@sha/parser.c"
+ break;
+
+ case 108:
-+#line 559 "../src/xkbcomp/parser.y"
-+ { FreeStmt((ParseCommon *) (yyvsp[-2].var)); (yyval.geom) = NULL; }
-+#line 2625 "xkbcommon@sha/parser.c"
++#line 582 "../src/xkbcomp/parser.y"
++ { FreeStmt((ParseCommon *) (yyvsp[-2].varList).head); (yyval.geom) = NULL; }
++#line 2637 "xkbcommon@sha/parser.c"
+ break;
+
+ case 109:
-+#line 562 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = 0; }
-+#line 2631 "xkbcommon@sha/parser.c"
++#line 585 "../src/xkbcomp/parser.y"
++ { (yyval.num) = 0; }
++#line 2643 "xkbcommon@sha/parser.c"
+ break;
+
+ case 110:
-+#line 563 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = 0; }
-+#line 2637 "xkbcommon@sha/parser.c"
++#line 586 "../src/xkbcomp/parser.y"
++ { (yyval.num) = 0; }
++#line 2649 "xkbcommon@sha/parser.c"
+ break;
+
+ case 111:
-+#line 564 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = 0; }
-+#line 2643 "xkbcommon@sha/parser.c"
++#line 587 "../src/xkbcomp/parser.y"
++ { (yyval.num) = 0; }
++#line 2655 "xkbcommon@sha/parser.c"
+ break;
+
+ case 112:
-+#line 565 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = 0; }
-+#line 2649 "xkbcommon@sha/parser.c"
++#line 588 "../src/xkbcomp/parser.y"
++ { (yyval.num) = 0; }
++#line 2661 "xkbcommon@sha/parser.c"
+ break;
+
+ case 113:
-+#line 568 "../src/xkbcomp/parser.y"
++#line 591 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = (yyvsp[0].atom); }
-+#line 2655 "xkbcommon@sha/parser.c"
++#line 2667 "xkbcommon@sha/parser.c"
+ break;
+
+ case 114:
-+#line 569 "../src/xkbcomp/parser.y"
++#line 592 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = (yyvsp[0].atom); }
-+#line 2661 "xkbcommon@sha/parser.c"
++#line 2673 "xkbcommon@sha/parser.c"
+ break;
+
+ case 115:
-+#line 573 "../src/xkbcomp/parser.y"
++#line 596 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "action"); }
-+#line 2667 "xkbcommon@sha/parser.c"
++#line 2679 "xkbcommon@sha/parser.c"
+ break;
+
+ case 116:
-+#line 575 "../src/xkbcomp/parser.y"
++#line 598 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "interpret"); }
-+#line 2673 "xkbcommon@sha/parser.c"
++#line 2685 "xkbcommon@sha/parser.c"
+ break;
+
+ case 117:
-+#line 577 "../src/xkbcomp/parser.y"
++#line 600 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "type"); }
-+#line 2679 "xkbcommon@sha/parser.c"
++#line 2691 "xkbcommon@sha/parser.c"
+ break;
+
+ case 118:
-+#line 579 "../src/xkbcomp/parser.y"
++#line 602 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "key"); }
-+#line 2685 "xkbcommon@sha/parser.c"
++#line 2697 "xkbcommon@sha/parser.c"
+ break;
+
+ case 119:
-+#line 581 "../src/xkbcomp/parser.y"
++#line 604 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "group"); }
-+#line 2691 "xkbcommon@sha/parser.c"
++#line 2703 "xkbcommon@sha/parser.c"
+ break;
+
+ case 120:
-+#line 583 "../src/xkbcomp/parser.y"
++#line 606 "../src/xkbcomp/parser.y"
+ {(yyval.atom) = xkb_atom_intern_literal(param->ctx, "modifier_map");}
-+#line 2697 "xkbcommon@sha/parser.c"
++#line 2709 "xkbcommon@sha/parser.c"
+ break;
+
+ case 121:
-+#line 585 "../src/xkbcomp/parser.y"
++#line 608 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "indicator"); }
-+#line 2703 "xkbcommon@sha/parser.c"
++#line 2715 "xkbcommon@sha/parser.c"
+ break;
+
+ case 122:
-+#line 587 "../src/xkbcomp/parser.y"
++#line 610 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "shape"); }
-+#line 2709 "xkbcommon@sha/parser.c"
++#line 2721 "xkbcommon@sha/parser.c"
+ break;
+
+ case 123:
-+#line 589 "../src/xkbcomp/parser.y"
++#line 612 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "row"); }
-+#line 2715 "xkbcommon@sha/parser.c"
++#line 2727 "xkbcommon@sha/parser.c"
+ break;
+
+ case 124:
-+#line 591 "../src/xkbcomp/parser.y"
++#line 614 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "section"); }
-+#line 2721 "xkbcommon@sha/parser.c"
++#line 2733 "xkbcommon@sha/parser.c"
+ break;
+
+ case 125:
-+#line 593 "../src/xkbcomp/parser.y"
++#line 616 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "text"); }
-+#line 2727 "xkbcommon@sha/parser.c"
++#line 2739 "xkbcommon@sha/parser.c"
+ break;
+
+ case 126:
-+#line 596 "../src/xkbcomp/parser.y"
++#line 619 "../src/xkbcomp/parser.y"
+ { (yyval.merge) = (yyvsp[0].merge); }
-+#line 2733 "xkbcommon@sha/parser.c"
++#line 2745 "xkbcommon@sha/parser.c"
+ break;
+
+ case 127:
-+#line 597 "../src/xkbcomp/parser.y"
++#line 620 "../src/xkbcomp/parser.y"
+ { (yyval.merge) = MERGE_DEFAULT; }
-+#line 2739 "xkbcommon@sha/parser.c"
++#line 2751 "xkbcommon@sha/parser.c"
+ break;
+
+ case 128:
-+#line 600 "../src/xkbcomp/parser.y"
++#line 623 "../src/xkbcomp/parser.y"
+ { (yyval.merge) = MERGE_DEFAULT; }
-+#line 2745 "xkbcommon@sha/parser.c"
++#line 2757 "xkbcommon@sha/parser.c"
+ break;
+
+ case 129:
-+#line 601 "../src/xkbcomp/parser.y"
++#line 624 "../src/xkbcomp/parser.y"
+ { (yyval.merge) = MERGE_AUGMENT; }
-+#line 2751 "xkbcommon@sha/parser.c"
++#line 2763 "xkbcommon@sha/parser.c"
+ break;
+
+ case 130:
-+#line 602 "../src/xkbcomp/parser.y"
++#line 625 "../src/xkbcomp/parser.y"
+ { (yyval.merge) = MERGE_OVERRIDE; }
-+#line 2757 "xkbcommon@sha/parser.c"
++#line 2769 "xkbcommon@sha/parser.c"
+ break;
+
+ case 131:
-+#line 603 "../src/xkbcomp/parser.y"
++#line 626 "../src/xkbcomp/parser.y"
+ { (yyval.merge) = MERGE_REPLACE; }
-+#line 2763 "xkbcommon@sha/parser.c"
++#line 2775 "xkbcommon@sha/parser.c"
+ break;
+
+ case 132:
-+#line 605 "../src/xkbcomp/parser.y"
++#line 628 "../src/xkbcomp/parser.y"
+ {
+ /*
+ * This used to be MERGE_ALT_FORM. This functionality was
@@ -2799,345 +2811,343 @@ index 0000000..ce49e55
+ */
+ (yyval.merge) = MERGE_DEFAULT;
+ }
-+#line 2775 "xkbcommon@sha/parser.c"
++#line 2787 "xkbcommon@sha/parser.c"
+ break;
+
+ case 133:
-+#line 614 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2781 "xkbcommon@sha/parser.c"
++#line 637 "../src/xkbcomp/parser.y"
++ { (yyval.exprList) = (yyvsp[0].exprList); }
++#line 2793 "xkbcommon@sha/parser.c"
+ break;
+
+ case 134:
-+#line 615 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = NULL; }
-+#line 2787 "xkbcommon@sha/parser.c"
++#line 638 "../src/xkbcomp/parser.y"
++ { (yyval.exprList).head = (yyval.exprList).last = NULL; }
++#line 2799 "xkbcommon@sha/parser.c"
+ break;
+
+ case 135:
-+#line 619 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = (ExprDef *) AppendStmt((ParseCommon *) (yyvsp[-2].expr),
-+ (ParseCommon *) (yyvsp[0].expr)); }
-+#line 2794 "xkbcommon@sha/parser.c"
++#line 642 "../src/xkbcomp/parser.y"
++ { (yyval.exprList).head = (yyvsp[-2].exprList).head; (yyval.exprList).last->common.next = &(yyvsp[0].expr)->common; (yyval.exprList).last = (yyvsp[0].expr); }
++#line 2805 "xkbcommon@sha/parser.c"
+ break;
+
+ case 136:
-+#line 622 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2800 "xkbcommon@sha/parser.c"
++#line 644 "../src/xkbcomp/parser.y"
++ { (yyval.exprList).head = (yyval.exprList).last = (yyvsp[0].expr); }
++#line 2811 "xkbcommon@sha/parser.c"
+ break;
+
+ case 137:
-+#line 626 "../src/xkbcomp/parser.y"
++#line 648 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateBinary(EXPR_DIVIDE, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2806 "xkbcommon@sha/parser.c"
++#line 2817 "xkbcommon@sha/parser.c"
+ break;
+
+ case 138:
-+#line 628 "../src/xkbcomp/parser.y"
++#line 650 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateBinary(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2812 "xkbcommon@sha/parser.c"
++#line 2823 "xkbcommon@sha/parser.c"
+ break;
+
+ case 139:
-+#line 630 "../src/xkbcomp/parser.y"
++#line 652 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateBinary(EXPR_SUBTRACT, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2818 "xkbcommon@sha/parser.c"
++#line 2829 "xkbcommon@sha/parser.c"
+ break;
+
+ case 140:
-+#line 632 "../src/xkbcomp/parser.y"
++#line 654 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateBinary(EXPR_MULTIPLY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2824 "xkbcommon@sha/parser.c"
++#line 2835 "xkbcommon@sha/parser.c"
+ break;
+
+ case 141:
-+#line 634 "../src/xkbcomp/parser.y"
++#line 656 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateBinary(EXPR_ASSIGN, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2830 "xkbcommon@sha/parser.c"
++#line 2841 "xkbcommon@sha/parser.c"
+ break;
+
+ case 142:
-+#line 636 "../src/xkbcomp/parser.y"
++#line 658 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2836 "xkbcommon@sha/parser.c"
++#line 2847 "xkbcommon@sha/parser.c"
+ break;
+
+ case 143:
-+#line 640 "../src/xkbcomp/parser.y"
++#line 662 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateUnary(EXPR_NEGATE, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); }
-+#line 2842 "xkbcommon@sha/parser.c"
++#line 2853 "xkbcommon@sha/parser.c"
+ break;
+
+ case 144:
-+#line 642 "../src/xkbcomp/parser.y"
++#line 664 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateUnary(EXPR_UNARY_PLUS, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); }
-+#line 2848 "xkbcommon@sha/parser.c"
++#line 2859 "xkbcommon@sha/parser.c"
+ break;
+
+ case 145:
-+#line 644 "../src/xkbcomp/parser.y"
++#line 666 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, (yyvsp[0].expr)); }
-+#line 2854 "xkbcommon@sha/parser.c"
++#line 2865 "xkbcommon@sha/parser.c"
+ break;
+
+ case 146:
-+#line 646 "../src/xkbcomp/parser.y"
++#line 668 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateUnary(EXPR_INVERT, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); }
-+#line 2860 "xkbcommon@sha/parser.c"
++#line 2871 "xkbcommon@sha/parser.c"
+ break;
+
+ case 147:
-+#line 648 "../src/xkbcomp/parser.y"
++#line 670 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2866 "xkbcommon@sha/parser.c"
++#line 2877 "xkbcommon@sha/parser.c"
+ break;
+
+ case 148:
-+#line 650 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].expr)); }
-+#line 2872 "xkbcommon@sha/parser.c"
++#line 672 "../src/xkbcomp/parser.y"
++ { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].exprList).head); }
++#line 2883 "xkbcommon@sha/parser.c"
+ break;
+
+ case 149:
-+#line 652 "../src/xkbcomp/parser.y"
++#line 674 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2878 "xkbcommon@sha/parser.c"
++#line 2889 "xkbcommon@sha/parser.c"
+ break;
+
+ case 150:
-+#line 654 "../src/xkbcomp/parser.y"
++#line 676 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
-+#line 2884 "xkbcommon@sha/parser.c"
++#line 2895 "xkbcommon@sha/parser.c"
+ break;
+
+ case 151:
-+#line 658 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = (ExprDef *) AppendStmt((ParseCommon *) (yyvsp[-2].expr),
-+ (ParseCommon *) (yyvsp[0].expr)); }
-+#line 2891 "xkbcommon@sha/parser.c"
++#line 680 "../src/xkbcomp/parser.y"
++ { (yyval.exprList).head = (yyvsp[-2].exprList).head; (yyval.exprList).last->common.next = &(yyvsp[0].expr)->common; (yyval.exprList).last = (yyvsp[0].expr); }
++#line 2901 "xkbcommon@sha/parser.c"
+ break;
+
+ case 152:
-+#line 661 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2897 "xkbcommon@sha/parser.c"
++#line 682 "../src/xkbcomp/parser.y"
++ { (yyval.exprList).head = (yyval.exprList).last = (yyvsp[0].expr); }
++#line 2907 "xkbcommon@sha/parser.c"
+ break;
+
+ case 153:
-+#line 665 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].expr)); }
-+#line 2903 "xkbcommon@sha/parser.c"
++#line 686 "../src/xkbcomp/parser.y"
++ { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].exprList).head); }
++#line 2913 "xkbcommon@sha/parser.c"
+ break;
+
+ case 154:
-+#line 669 "../src/xkbcomp/parser.y"
++#line 690 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateIdent((yyvsp[0].atom)); }
-+#line 2909 "xkbcommon@sha/parser.c"
++#line 2919 "xkbcommon@sha/parser.c"
+ break;
+
+ case 155:
-+#line 671 "../src/xkbcomp/parser.y"
++#line 692 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateFieldRef((yyvsp[-2].atom), (yyvsp[0].atom)); }
-+#line 2915 "xkbcommon@sha/parser.c"
++#line 2925 "xkbcommon@sha/parser.c"
+ break;
+
+ case 156:
-+#line 673 "../src/xkbcomp/parser.y"
++#line 694 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateArrayRef(XKB_ATOM_NONE, (yyvsp[-3].atom), (yyvsp[-1].expr)); }
-+#line 2921 "xkbcommon@sha/parser.c"
++#line 2931 "xkbcommon@sha/parser.c"
+ break;
+
+ case 157:
-+#line 675 "../src/xkbcomp/parser.y"
++#line 696 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateArrayRef((yyvsp[-5].atom), (yyvsp[-3].atom), (yyvsp[-1].expr)); }
-+#line 2927 "xkbcommon@sha/parser.c"
++#line 2937 "xkbcommon@sha/parser.c"
+ break;
+
+ case 158:
-+#line 679 "../src/xkbcomp/parser.y"
++#line 700 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateString((yyvsp[0].atom)); }
-+#line 2933 "xkbcommon@sha/parser.c"
++#line 2943 "xkbcommon@sha/parser.c"
+ break;
+
+ case 159:
-+#line 681 "../src/xkbcomp/parser.y"
-+ { (yyval.expr) = ExprCreateInteger((yyvsp[0].ival)); }
-+#line 2939 "xkbcommon@sha/parser.c"
++#line 702 "../src/xkbcomp/parser.y"
++ { (yyval.expr) = ExprCreateInteger((yyvsp[0].num)); }
++#line 2949 "xkbcommon@sha/parser.c"
+ break;
+
+ case 160:
-+#line 683 "../src/xkbcomp/parser.y"
++#line 704 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateFloat(/* Discard $1 */); }
-+#line 2945 "xkbcommon@sha/parser.c"
++#line 2955 "xkbcommon@sha/parser.c"
+ break;
+
+ case 161:
-+#line 685 "../src/xkbcomp/parser.y"
++#line 706 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateKeyName((yyvsp[0].atom)); }
-+#line 2951 "xkbcommon@sha/parser.c"
++#line 2961 "xkbcommon@sha/parser.c"
+ break;
+
+ case 162:
-+#line 688 "../src/xkbcomp/parser.y"
++#line 709 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
-+#line 2957 "xkbcommon@sha/parser.c"
++#line 2967 "xkbcommon@sha/parser.c"
+ break;
+
+ case 163:
-+#line 689 "../src/xkbcomp/parser.y"
++#line 710 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = NULL; }
-+#line 2963 "xkbcommon@sha/parser.c"
++#line 2973 "xkbcommon@sha/parser.c"
+ break;
+
+ case 164:
-+#line 693 "../src/xkbcomp/parser.y"
++#line 714 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprAppendKeysymList((yyvsp[-2].expr), (yyvsp[0].keysym)); }
-+#line 2969 "xkbcommon@sha/parser.c"
++#line 2979 "xkbcommon@sha/parser.c"
+ break;
+
+ case 165:
-+#line 695 "../src/xkbcomp/parser.y"
++#line 716 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprAppendMultiKeysymList((yyvsp[-2].expr), (yyvsp[0].expr)); }
-+#line 2975 "xkbcommon@sha/parser.c"
++#line 2985 "xkbcommon@sha/parser.c"
+ break;
+
+ case 166:
-+#line 697 "../src/xkbcomp/parser.y"
++#line 718 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateKeysymList((yyvsp[0].keysym)); }
-+#line 2981 "xkbcommon@sha/parser.c"
++#line 2991 "xkbcommon@sha/parser.c"
+ break;
+
+ case 167:
-+#line 699 "../src/xkbcomp/parser.y"
++#line 720 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = ExprCreateMultiKeysymList((yyvsp[0].expr)); }
-+#line 2987 "xkbcommon@sha/parser.c"
++#line 2997 "xkbcommon@sha/parser.c"
+ break;
+
+ case 168:
-+#line 703 "../src/xkbcomp/parser.y"
++#line 724 "../src/xkbcomp/parser.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
-+#line 2993 "xkbcommon@sha/parser.c"
++#line 3003 "xkbcommon@sha/parser.c"
+ break;
+
+ case 169:
-+#line 707 "../src/xkbcomp/parser.y"
++#line 728 "../src/xkbcomp/parser.y"
+ {
+ if (!resolve_keysym((yyvsp[0].str), &(yyval.keysym)))
+ parser_warn(param, "unrecognized keysym \"%s\"", (yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
-+#line 3003 "xkbcommon@sha/parser.c"
++#line 3013 "xkbcommon@sha/parser.c"
+ break;
+
+ case 170:
-+#line 712 "../src/xkbcomp/parser.y"
++#line 733 "../src/xkbcomp/parser.y"
+ { (yyval.keysym) = XKB_KEY_section; }
-+#line 3009 "xkbcommon@sha/parser.c"
++#line 3019 "xkbcommon@sha/parser.c"
+ break;
+
+ case 171:
-+#line 714 "../src/xkbcomp/parser.y"
++#line 735 "../src/xkbcomp/parser.y"
+ {
-+ if ((yyvsp[0].ival) < 0) {
-+ parser_warn(param, "unrecognized keysym \"%d\"", (yyvsp[0].ival));
++ if ((yyvsp[0].num) < 0) {
++ parser_warn(param, "unrecognized keysym \"%ld\"", (yyvsp[0].num));
+ (yyval.keysym) = XKB_KEY_NoSymbol;
+ }
-+ else if ((yyvsp[0].ival) < 10) { /* XKB_KEY_0 .. XKB_KEY_9 */
-+ (yyval.keysym) = XKB_KEY_0 + (xkb_keysym_t) (yyvsp[0].ival);
++ else if ((yyvsp[0].num) < 10) { /* XKB_KEY_0 .. XKB_KEY_9 */
++ (yyval.keysym) = XKB_KEY_0 + (xkb_keysym_t) (yyvsp[0].num);
+ }
+ else {
-+ char buf[17];
-+ snprintf(buf, sizeof(buf), "0x%x", (yyvsp[0].ival));
++ char buf[32];
++ snprintf(buf, sizeof(buf), "0x%"PRIx64, (yyvsp[0].num));
+ if (!resolve_keysym(buf, &(yyval.keysym))) {
+ parser_warn(param, "unrecognized keysym \"%s\"", buf);
+ (yyval.keysym) = XKB_KEY_NoSymbol;
+ }
+ }
+ }
-+#line 3031 "xkbcommon@sha/parser.c"
++#line 3041 "xkbcommon@sha/parser.c"
+ break;
+
+ case 172:
-+#line 733 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = -(yyvsp[0].ival); }
-+#line 3037 "xkbcommon@sha/parser.c"
++#line 754 "../src/xkbcomp/parser.y"
++ { (yyval.num) = -(yyvsp[0].num); }
++#line 3047 "xkbcommon@sha/parser.c"
+ break;
+
+ case 173:
-+#line 734 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = (yyvsp[0].ival); }
-+#line 3043 "xkbcommon@sha/parser.c"
++#line 755 "../src/xkbcomp/parser.y"
++ { (yyval.num) = (yyvsp[0].num); }
++#line 3053 "xkbcommon@sha/parser.c"
+ break;
+
+ case 174:
-+#line 737 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = (yyvsp[0].num); }
-+#line 3049 "xkbcommon@sha/parser.c"
++#line 758 "../src/xkbcomp/parser.y"
++ { (yyval.num) = (yyvsp[0].num); }
++#line 3059 "xkbcommon@sha/parser.c"
+ break;
+
+ case 175:
-+#line 738 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = (yyvsp[0].num); }
-+#line 3055 "xkbcommon@sha/parser.c"
++#line 759 "../src/xkbcomp/parser.y"
++ { (yyval.num) = (yyvsp[0].num); }
++#line 3065 "xkbcommon@sha/parser.c"
+ break;
+
+ case 176:
-+#line 741 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = 0; }
-+#line 3061 "xkbcommon@sha/parser.c"
++#line 762 "../src/xkbcomp/parser.y"
++ { (yyval.num) = 0; }
++#line 3071 "xkbcommon@sha/parser.c"
+ break;
+
+ case 177:
-+#line 744 "../src/xkbcomp/parser.y"
-+ { (yyval.ival) = (yyvsp[0].num); }
-+#line 3067 "xkbcommon@sha/parser.c"
++#line 765 "../src/xkbcomp/parser.y"
++ { (yyval.num) = (yyvsp[0].num); }
++#line 3077 "xkbcommon@sha/parser.c"
+ break;
+
+ case 178:
-+#line 747 "../src/xkbcomp/parser.y"
++#line 768 "../src/xkbcomp/parser.y"
+ { (yyval.num) = (yyvsp[0].num); }
-+#line 3073 "xkbcommon@sha/parser.c"
++#line 3083 "xkbcommon@sha/parser.c"
+ break;
+
+ case 179:
-+#line 750 "../src/xkbcomp/parser.y"
-+ { (yyval.atom) = xkb_atom_steal(param->ctx, (yyvsp[0].str)); }
-+#line 3079 "xkbcommon@sha/parser.c"
++#line 771 "../src/xkbcomp/parser.y"
++ { (yyval.atom) = xkb_atom_intern(param->ctx, (yyvsp[0].str), strlen((yyvsp[0].str))); free((yyvsp[0].str)); }
++#line 3089 "xkbcommon@sha/parser.c"
+ break;
+
+ case 180:
-+#line 751 "../src/xkbcomp/parser.y"
++#line 772 "../src/xkbcomp/parser.y"
+ { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "default"); }
-+#line 3085 "xkbcommon@sha/parser.c"
++#line 3095 "xkbcommon@sha/parser.c"
+ break;
+
+ case 181:
-+#line 754 "../src/xkbcomp/parser.y"
-+ { (yyval.atom) = xkb_atom_steal(param->ctx, (yyvsp[0].str)); }
-+#line 3091 "xkbcommon@sha/parser.c"
++#line 775 "../src/xkbcomp/parser.y"
++ { (yyval.atom) = xkb_atom_intern(param->ctx, (yyvsp[0].str), strlen((yyvsp[0].str))); free((yyvsp[0].str)); }
++#line 3101 "xkbcommon@sha/parser.c"
+ break;
+
+ case 182:
-+#line 757 "../src/xkbcomp/parser.y"
++#line 778 "../src/xkbcomp/parser.y"
+ { (yyval.str) = (yyvsp[0].str); }
-+#line 3097 "xkbcommon@sha/parser.c"
++#line 3107 "xkbcommon@sha/parser.c"
+ break;
+
+ case 183:
-+#line 758 "../src/xkbcomp/parser.y"
++#line 779 "../src/xkbcomp/parser.y"
+ { (yyval.str) = NULL; }
-+#line 3103 "xkbcommon@sha/parser.c"
++#line 3113 "xkbcommon@sha/parser.c"
+ break;
+
+ case 184:
-+#line 761 "../src/xkbcomp/parser.y"
++#line 782 "../src/xkbcomp/parser.y"
+ { (yyval.str) = (yyvsp[0].str); }
-+#line 3109 "xkbcommon@sha/parser.c"
++#line 3119 "xkbcommon@sha/parser.c"
+ break;
+
+
-+#line 3113 "xkbcommon@sha/parser.c"
++#line 3123 "xkbcommon@sha/parser.c"
+
+ default: break;
+ }
@@ -3369,7 +3379,7 @@ index 0000000..ce49e55
+#endif
+ return yyresult;
+}
-+#line 764 "../src/xkbcomp/parser.y"
++#line 785 "../src/xkbcomp/parser.y"
+
+
+XkbFile *
@@ -3429,11 +3439,11 @@ index 0000000..ce49e55
+}
diff --git a/src/xkbcomp/parser.h b/src/xkbcomp/parser.h
new file mode 100644
-index 0000000..a5ba362
+index 0000000..35778ec
--- /dev/null
+++ b/src/xkbcomp/parser.h
-@@ -0,0 +1,160 @@
-+/* A Bison parser, made by GNU Bison 3.4.1. */
+@@ -0,0 +1,164 @@
++/* A Bison parser, made by GNU Bison 3.4.2. */
+
+/* Bison interface for Yacc-like parsers in C
+
@@ -3554,9 +3564,8 @@ index 0000000..a5ba362
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
-+#line 162 "../src/xkbcomp/parser.y"
++#line 164 "../src/xkbcomp/parser.y"
+
-+ int ival;
+ int64_t num;
+ enum xkb_file_type file_type;
+ char *str;
@@ -3565,9 +3574,13 @@ index 0000000..a5ba362
+ enum xkb_map_flags mapFlags;
+ xkb_keysym_t keysym;
+ ParseCommon *any;
++ struct { ParseCommon *head; ParseCommon *last; } anyList;
+ ExprDef *expr;
++ struct { ExprDef *head; ExprDef *last; } exprList;
+ VarDef *var;
++ struct { VarDef *head; VarDef *last; } varList;
+ VModDef *vmod;
++ struct { VModDef *head; VModDef *last; } vmodList;
+ InterpDef *interp;
+ KeyTypeDef *keyType;
+ SymbolsDef *syms;
@@ -3579,8 +3592,9 @@ index 0000000..a5ba362
+ KeyAliasDef *keyAlias;
+ void *geom;
+ XkbFile *file;
++ struct { XkbFile *head; XkbFile *last; } fileList;
+
-+#line 149 "xkbcommon@sha/parser.h"
++#line 153 "xkbcommon@sha/parser.h"
+
+};
+typedef union YYSTYPE YYSTYPE;
@@ -3594,5 +3608,5 @@ index 0000000..a5ba362
+
+#endif /* !YY__XKBCOMMON_XKBCOMMON_SHA_PARSER_H_INCLUDED */
--
-2.23.0
+2.25.0
diff --git a/pkg/libxkbcommon/src b/pkg/libxkbcommon/src
-Subproject 6d83838cc2e89a61d081e6f7f53aa9bccd0ddb3
+Subproject e3c3420a7146f4ea6225d6fb417baa05a79c820
diff --git a/pkg/libxkbcommon/ver b/pkg/libxkbcommon/ver
index 0b37c4f5..8543cbb8 100644
--- a/pkg/libxkbcommon/ver
+++ b/pkg/libxkbcommon/ver
@@ -1 +1 @@
-0.9.1 r1
+0.10.0 r0