1*2b949d04SAndroid Build Coastguard Worker /************************************************************
2*2b949d04SAndroid Build Coastguard Worker Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
3*2b949d04SAndroid Build Coastguard Worker
4*2b949d04SAndroid Build Coastguard Worker Permission to use, copy, modify, and distribute this
5*2b949d04SAndroid Build Coastguard Worker software and its documentation for any purpose and without
6*2b949d04SAndroid Build Coastguard Worker fee is hereby granted, provided that the above copyright
7*2b949d04SAndroid Build Coastguard Worker notice appear in all copies and that both that copyright
8*2b949d04SAndroid Build Coastguard Worker notice and this permission notice appear in supporting
9*2b949d04SAndroid Build Coastguard Worker documentation, and that the name of Silicon Graphics not be
10*2b949d04SAndroid Build Coastguard Worker used in advertising or publicity pertaining to distribution
11*2b949d04SAndroid Build Coastguard Worker of the software without specific prior written permission.
12*2b949d04SAndroid Build Coastguard Worker Silicon Graphics makes no representation about the suitability
13*2b949d04SAndroid Build Coastguard Worker of this software for any purpose. It is provided "as is"
14*2b949d04SAndroid Build Coastguard Worker without any express or implied warranty.
15*2b949d04SAndroid Build Coastguard Worker
16*2b949d04SAndroid Build Coastguard Worker SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17*2b949d04SAndroid Build Coastguard Worker SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18*2b949d04SAndroid Build Coastguard Worker AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19*2b949d04SAndroid Build Coastguard Worker GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20*2b949d04SAndroid Build Coastguard Worker DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21*2b949d04SAndroid Build Coastguard Worker DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22*2b949d04SAndroid Build Coastguard Worker OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23*2b949d04SAndroid Build Coastguard Worker THE USE OR PERFORMANCE OF THIS SOFTWARE.
24*2b949d04SAndroid Build Coastguard Worker
25*2b949d04SAndroid Build Coastguard Worker ********************************************************/
26*2b949d04SAndroid Build Coastguard Worker
27*2b949d04SAndroid Build Coastguard Worker /*
28*2b949d04SAndroid Build Coastguard Worker * The parser should work with reasonably recent versions of either
29*2b949d04SAndroid Build Coastguard Worker * bison or byacc. So if you make changes, try to make sure it works
30*2b949d04SAndroid Build Coastguard Worker * in both!
31*2b949d04SAndroid Build Coastguard Worker */
32*2b949d04SAndroid Build Coastguard Worker
33*2b949d04SAndroid Build Coastguard Worker %{
34*2b949d04SAndroid Build Coastguard Worker #include "config.h"
35*2b949d04SAndroid Build Coastguard Worker
36*2b949d04SAndroid Build Coastguard Worker #include "xkbcomp/xkbcomp-priv.h"
37*2b949d04SAndroid Build Coastguard Worker #include "xkbcomp/ast-build.h"
38*2b949d04SAndroid Build Coastguard Worker #include "xkbcomp/parser-priv.h"
39*2b949d04SAndroid Build Coastguard Worker #include "scanner-utils.h"
40*2b949d04SAndroid Build Coastguard Worker
41*2b949d04SAndroid Build Coastguard Worker struct parser_param {
42*2b949d04SAndroid Build Coastguard Worker struct xkb_context *ctx;
43*2b949d04SAndroid Build Coastguard Worker struct scanner *scanner;
44*2b949d04SAndroid Build Coastguard Worker XkbFile *rtrn;
45*2b949d04SAndroid Build Coastguard Worker bool more_maps;
46*2b949d04SAndroid Build Coastguard Worker };
47*2b949d04SAndroid Build Coastguard Worker
48*2b949d04SAndroid Build Coastguard Worker #define parser_err(param, fmt, ...) \
49*2b949d04SAndroid Build Coastguard Worker scanner_err((param)->scanner, fmt, ##__VA_ARGS__)
50*2b949d04SAndroid Build Coastguard Worker
51*2b949d04SAndroid Build Coastguard Worker #define parser_warn(param, fmt, ...) \
52*2b949d04SAndroid Build Coastguard Worker scanner_warn((param)->scanner, fmt, ##__VA_ARGS__)
53*2b949d04SAndroid Build Coastguard Worker
54*2b949d04SAndroid Build Coastguard Worker static void
_xkbcommon_error(struct parser_param * param,const char * msg)55*2b949d04SAndroid Build Coastguard Worker _xkbcommon_error(struct parser_param *param, const char *msg)
56*2b949d04SAndroid Build Coastguard Worker {
57*2b949d04SAndroid Build Coastguard Worker parser_err(param, "%s", msg);
58*2b949d04SAndroid Build Coastguard Worker }
59*2b949d04SAndroid Build Coastguard Worker
60*2b949d04SAndroid Build Coastguard Worker static bool
resolve_keysym(const char * name,xkb_keysym_t * sym_rtrn)61*2b949d04SAndroid Build Coastguard Worker resolve_keysym(const char *name, xkb_keysym_t *sym_rtrn)
62*2b949d04SAndroid Build Coastguard Worker {
63*2b949d04SAndroid Build Coastguard Worker xkb_keysym_t sym;
64*2b949d04SAndroid Build Coastguard Worker
65*2b949d04SAndroid Build Coastguard Worker if (!name || istreq(name, "any") || istreq(name, "nosymbol")) {
66*2b949d04SAndroid Build Coastguard Worker *sym_rtrn = XKB_KEY_NoSymbol;
67*2b949d04SAndroid Build Coastguard Worker return true;
68*2b949d04SAndroid Build Coastguard Worker }
69*2b949d04SAndroid Build Coastguard Worker
70*2b949d04SAndroid Build Coastguard Worker if (istreq(name, "none") || istreq(name, "voidsymbol")) {
71*2b949d04SAndroid Build Coastguard Worker *sym_rtrn = XKB_KEY_VoidSymbol;
72*2b949d04SAndroid Build Coastguard Worker return true;
73*2b949d04SAndroid Build Coastguard Worker }
74*2b949d04SAndroid Build Coastguard Worker
75*2b949d04SAndroid Build Coastguard Worker sym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS);
76*2b949d04SAndroid Build Coastguard Worker if (sym != XKB_KEY_NoSymbol) {
77*2b949d04SAndroid Build Coastguard Worker *sym_rtrn = sym;
78*2b949d04SAndroid Build Coastguard Worker return true;
79*2b949d04SAndroid Build Coastguard Worker }
80*2b949d04SAndroid Build Coastguard Worker
81*2b949d04SAndroid Build Coastguard Worker return false;
82*2b949d04SAndroid Build Coastguard Worker }
83*2b949d04SAndroid Build Coastguard Worker
84*2b949d04SAndroid Build Coastguard Worker #define param_scanner param->scanner
85*2b949d04SAndroid Build Coastguard Worker %}
86*2b949d04SAndroid Build Coastguard Worker
87*2b949d04SAndroid Build Coastguard Worker %pure-parser
88*2b949d04SAndroid Build Coastguard Worker %lex-param { struct scanner *param_scanner }
89*2b949d04SAndroid Build Coastguard Worker %parse-param { struct parser_param *param }
90*2b949d04SAndroid Build Coastguard Worker
91*2b949d04SAndroid Build Coastguard Worker %token
92*2b949d04SAndroid Build Coastguard Worker END_OF_FILE 0
93*2b949d04SAndroid Build Coastguard Worker ERROR_TOK 255
94*2b949d04SAndroid Build Coastguard Worker XKB_KEYMAP 1
95*2b949d04SAndroid Build Coastguard Worker XKB_KEYCODES 2
96*2b949d04SAndroid Build Coastguard Worker XKB_TYPES 3
97*2b949d04SAndroid Build Coastguard Worker XKB_SYMBOLS 4
98*2b949d04SAndroid Build Coastguard Worker XKB_COMPATMAP 5
99*2b949d04SAndroid Build Coastguard Worker XKB_GEOMETRY 6
100*2b949d04SAndroid Build Coastguard Worker XKB_SEMANTICS 7
101*2b949d04SAndroid Build Coastguard Worker XKB_LAYOUT 8
102*2b949d04SAndroid Build Coastguard Worker INCLUDE 10
103*2b949d04SAndroid Build Coastguard Worker OVERRIDE 11
104*2b949d04SAndroid Build Coastguard Worker AUGMENT 12
105*2b949d04SAndroid Build Coastguard Worker REPLACE 13
106*2b949d04SAndroid Build Coastguard Worker ALTERNATE 14
107*2b949d04SAndroid Build Coastguard Worker VIRTUAL_MODS 20
108*2b949d04SAndroid Build Coastguard Worker TYPE 21
109*2b949d04SAndroid Build Coastguard Worker INTERPRET 22
110*2b949d04SAndroid Build Coastguard Worker ACTION_TOK 23
111*2b949d04SAndroid Build Coastguard Worker KEY 24
112*2b949d04SAndroid Build Coastguard Worker ALIAS 25
113*2b949d04SAndroid Build Coastguard Worker GROUP 26
114*2b949d04SAndroid Build Coastguard Worker MODIFIER_MAP 27
115*2b949d04SAndroid Build Coastguard Worker INDICATOR 28
116*2b949d04SAndroid Build Coastguard Worker SHAPE 29
117*2b949d04SAndroid Build Coastguard Worker KEYS 30
118*2b949d04SAndroid Build Coastguard Worker ROW 31
119*2b949d04SAndroid Build Coastguard Worker SECTION 32
120*2b949d04SAndroid Build Coastguard Worker OVERLAY 33
121*2b949d04SAndroid Build Coastguard Worker TEXT 34
122*2b949d04SAndroid Build Coastguard Worker OUTLINE 35
123*2b949d04SAndroid Build Coastguard Worker SOLID 36
124*2b949d04SAndroid Build Coastguard Worker LOGO 37
125*2b949d04SAndroid Build Coastguard Worker VIRTUAL 38
126*2b949d04SAndroid Build Coastguard Worker EQUALS 40
127*2b949d04SAndroid Build Coastguard Worker PLUS 41
128*2b949d04SAndroid Build Coastguard Worker MINUS 42
129*2b949d04SAndroid Build Coastguard Worker DIVIDE 43
130*2b949d04SAndroid Build Coastguard Worker TIMES 44
131*2b949d04SAndroid Build Coastguard Worker OBRACE 45
132*2b949d04SAndroid Build Coastguard Worker CBRACE 46
133*2b949d04SAndroid Build Coastguard Worker OPAREN 47
134*2b949d04SAndroid Build Coastguard Worker CPAREN 48
135*2b949d04SAndroid Build Coastguard Worker OBRACKET 49
136*2b949d04SAndroid Build Coastguard Worker CBRACKET 50
137*2b949d04SAndroid Build Coastguard Worker DOT 51
138*2b949d04SAndroid Build Coastguard Worker COMMA 52
139*2b949d04SAndroid Build Coastguard Worker SEMI 53
140*2b949d04SAndroid Build Coastguard Worker EXCLAM 54
141*2b949d04SAndroid Build Coastguard Worker INVERT 55
142*2b949d04SAndroid Build Coastguard Worker STRING 60
143*2b949d04SAndroid Build Coastguard Worker INTEGER 61
144*2b949d04SAndroid Build Coastguard Worker FLOAT 62
145*2b949d04SAndroid Build Coastguard Worker IDENT 63
146*2b949d04SAndroid Build Coastguard Worker KEYNAME 64
147*2b949d04SAndroid Build Coastguard Worker PARTIAL 70
148*2b949d04SAndroid Build Coastguard Worker DEFAULT 71
149*2b949d04SAndroid Build Coastguard Worker HIDDEN 72
150*2b949d04SAndroid Build Coastguard Worker ALPHANUMERIC_KEYS 73
151*2b949d04SAndroid Build Coastguard Worker MODIFIER_KEYS 74
152*2b949d04SAndroid Build Coastguard Worker KEYPAD_KEYS 75
153*2b949d04SAndroid Build Coastguard Worker FUNCTION_KEYS 76
154*2b949d04SAndroid Build Coastguard Worker ALTERNATE_GROUP 77
155*2b949d04SAndroid Build Coastguard Worker
156*2b949d04SAndroid Build Coastguard Worker %right EQUALS
157*2b949d04SAndroid Build Coastguard Worker %left PLUS MINUS
158*2b949d04SAndroid Build Coastguard Worker %left TIMES DIVIDE
159*2b949d04SAndroid Build Coastguard Worker %left EXCLAM INVERT
160*2b949d04SAndroid Build Coastguard Worker %left OPAREN
161*2b949d04SAndroid Build Coastguard Worker
162*2b949d04SAndroid Build Coastguard Worker %start XkbFile
163*2b949d04SAndroid Build Coastguard Worker
164*2b949d04SAndroid Build Coastguard Worker %union {
165*2b949d04SAndroid Build Coastguard Worker int64_t num;
166*2b949d04SAndroid Build Coastguard Worker enum xkb_file_type file_type;
167*2b949d04SAndroid Build Coastguard Worker char *str;
168*2b949d04SAndroid Build Coastguard Worker xkb_atom_t atom;
169*2b949d04SAndroid Build Coastguard Worker enum merge_mode merge;
170*2b949d04SAndroid Build Coastguard Worker enum xkb_map_flags mapFlags;
171*2b949d04SAndroid Build Coastguard Worker xkb_keysym_t keysym;
172*2b949d04SAndroid Build Coastguard Worker ParseCommon *any;
173*2b949d04SAndroid Build Coastguard Worker struct { ParseCommon *head; ParseCommon *last; } anyList;
174*2b949d04SAndroid Build Coastguard Worker ExprDef *expr;
175*2b949d04SAndroid Build Coastguard Worker struct { ExprDef *head; ExprDef *last; } exprList;
176*2b949d04SAndroid Build Coastguard Worker VarDef *var;
177*2b949d04SAndroid Build Coastguard Worker struct { VarDef *head; VarDef *last; } varList;
178*2b949d04SAndroid Build Coastguard Worker VModDef *vmod;
179*2b949d04SAndroid Build Coastguard Worker struct { VModDef *head; VModDef *last; } vmodList;
180*2b949d04SAndroid Build Coastguard Worker InterpDef *interp;
181*2b949d04SAndroid Build Coastguard Worker KeyTypeDef *keyType;
182*2b949d04SAndroid Build Coastguard Worker SymbolsDef *syms;
183*2b949d04SAndroid Build Coastguard Worker ModMapDef *modMask;
184*2b949d04SAndroid Build Coastguard Worker GroupCompatDef *groupCompat;
185*2b949d04SAndroid Build Coastguard Worker LedMapDef *ledMap;
186*2b949d04SAndroid Build Coastguard Worker LedNameDef *ledName;
187*2b949d04SAndroid Build Coastguard Worker KeycodeDef *keyCode;
188*2b949d04SAndroid Build Coastguard Worker KeyAliasDef *keyAlias;
189*2b949d04SAndroid Build Coastguard Worker void *geom;
190*2b949d04SAndroid Build Coastguard Worker XkbFile *file;
191*2b949d04SAndroid Build Coastguard Worker struct { XkbFile *head; XkbFile *last; } fileList;
192*2b949d04SAndroid Build Coastguard Worker }
193*2b949d04SAndroid Build Coastguard Worker
194*2b949d04SAndroid Build Coastguard Worker %type <num> INTEGER FLOAT
195*2b949d04SAndroid Build Coastguard Worker %type <str> IDENT STRING
196*2b949d04SAndroid Build Coastguard Worker %type <atom> KEYNAME
197*2b949d04SAndroid Build Coastguard Worker %type <num> KeyCode Number Integer Float SignedNumber DoodadType
198*2b949d04SAndroid Build Coastguard Worker %type <merge> MergeMode OptMergeMode
199*2b949d04SAndroid Build Coastguard Worker %type <file_type> XkbCompositeType FileType
200*2b949d04SAndroid Build Coastguard Worker %type <mapFlags> Flag Flags OptFlags
201*2b949d04SAndroid Build Coastguard Worker %type <str> MapName OptMapName
202*2b949d04SAndroid Build Coastguard Worker %type <atom> FieldSpec Ident Element String
203*2b949d04SAndroid Build Coastguard Worker %type <keysym> KeySym
204*2b949d04SAndroid Build Coastguard Worker %type <any> Decl
205*2b949d04SAndroid Build Coastguard Worker %type <anyList> DeclList
206*2b949d04SAndroid Build Coastguard Worker %type <expr> Expr Term Lhs Terminal ArrayInit KeySyms
207*2b949d04SAndroid Build Coastguard Worker %type <expr> OptKeySymList KeySymList Action Coord CoordList
208*2b949d04SAndroid Build Coastguard Worker %type <exprList> OptExprList ExprList ActionList
209*2b949d04SAndroid Build Coastguard Worker %type <var> VarDecl SymbolsVarDecl
210*2b949d04SAndroid Build Coastguard Worker %type <varList> VarDeclList SymbolsBody
211*2b949d04SAndroid Build Coastguard Worker %type <vmod> VModDef
212*2b949d04SAndroid Build Coastguard Worker %type <vmodList> VModDefList VModDecl
213*2b949d04SAndroid Build Coastguard Worker %type <interp> InterpretDecl InterpretMatch
214*2b949d04SAndroid Build Coastguard Worker %type <keyType> KeyTypeDecl
215*2b949d04SAndroid Build Coastguard Worker %type <syms> SymbolsDecl
216*2b949d04SAndroid Build Coastguard Worker %type <modMask> ModMapDecl
217*2b949d04SAndroid Build Coastguard Worker %type <groupCompat> GroupCompatDecl
218*2b949d04SAndroid Build Coastguard Worker %type <ledMap> LedMapDecl
219*2b949d04SAndroid Build Coastguard Worker %type <ledName> LedNameDecl
220*2b949d04SAndroid Build Coastguard Worker %type <keyCode> KeyNameDecl
221*2b949d04SAndroid Build Coastguard Worker %type <keyAlias> KeyAliasDecl
222*2b949d04SAndroid Build Coastguard Worker %type <geom> ShapeDecl SectionDecl SectionBody SectionBodyItem RowBody RowBodyItem
223*2b949d04SAndroid Build Coastguard Worker %type <geom> Keys Key OverlayDecl OverlayKeyList OverlayKey OutlineList OutlineInList
224*2b949d04SAndroid Build Coastguard Worker %type <geom> DoodadDecl
225*2b949d04SAndroid Build Coastguard Worker %type <file> XkbFile XkbMapConfig
226*2b949d04SAndroid Build Coastguard Worker %type <fileList> XkbMapConfigList
227*2b949d04SAndroid Build Coastguard Worker %type <file> XkbCompositeMap
228*2b949d04SAndroid Build Coastguard Worker
229*2b949d04SAndroid Build Coastguard Worker %destructor { FreeStmt((ParseCommon *) $$); }
230*2b949d04SAndroid Build Coastguard Worker <any> <expr> <var> <vmod> <interp> <keyType> <syms> <modMask> <groupCompat>
231*2b949d04SAndroid Build Coastguard Worker <ledMap> <ledName> <keyCode> <keyAlias>
232*2b949d04SAndroid Build Coastguard Worker %destructor { FreeStmt((ParseCommon *) $$.head); }
233*2b949d04SAndroid Build Coastguard Worker <anyList> <exprList> <varList> <vmodList>
234*2b949d04SAndroid Build Coastguard Worker /* The destructor also runs on the start symbol when the parser *succeeds*.
235*2b949d04SAndroid Build Coastguard Worker * The `if` here catches this case. */
236*2b949d04SAndroid Build Coastguard Worker %destructor { if (!param->rtrn) FreeXkbFile($$); } <file>
237*2b949d04SAndroid Build Coastguard Worker %destructor { FreeXkbFile($$.head); } <fileList>
238*2b949d04SAndroid Build Coastguard Worker %destructor { free($$); } <str>
239*2b949d04SAndroid Build Coastguard Worker
240*2b949d04SAndroid Build Coastguard Worker %%
241*2b949d04SAndroid Build Coastguard Worker
242*2b949d04SAndroid Build Coastguard Worker /*
243*2b949d04SAndroid Build Coastguard Worker * An actual file may contain more than one map. However, if we do things
244*2b949d04SAndroid Build Coastguard Worker * in the normal yacc way, i.e. aggregate all of the maps into a list and
245*2b949d04SAndroid Build Coastguard Worker * let the caller find the map it wants, we end up scanning and parsing a
246*2b949d04SAndroid Build Coastguard Worker * lot of unneeded maps (in the end we always just need one).
247*2b949d04SAndroid Build Coastguard Worker * Instead of doing that, we make yyparse return one map at a time, and
248*2b949d04SAndroid Build Coastguard Worker * then call it repeatedly until we find the map we need. Once we find it,
249*2b949d04SAndroid Build Coastguard Worker * we don't need to parse everything that follows in the file.
250*2b949d04SAndroid Build Coastguard Worker * This does mean that if we e.g. always use the first map, the file may
251*2b949d04SAndroid Build Coastguard Worker * contain complete garbage after that. But it's worth it.
252*2b949d04SAndroid Build Coastguard Worker */
253*2b949d04SAndroid Build Coastguard Worker
254*2b949d04SAndroid Build Coastguard Worker XkbFile : XkbCompositeMap
255*2b949d04SAndroid Build Coastguard Worker { $$ = param->rtrn = $1; param->more_maps = !!param->rtrn; }
256*2b949d04SAndroid Build Coastguard Worker | XkbMapConfig
257*2b949d04SAndroid Build Coastguard Worker { $$ = param->rtrn = $1; param->more_maps = !!param->rtrn; YYACCEPT; }
258*2b949d04SAndroid Build Coastguard Worker | END_OF_FILE
259*2b949d04SAndroid Build Coastguard Worker { $$ = param->rtrn = NULL; param->more_maps = false; }
260*2b949d04SAndroid Build Coastguard Worker ;
261*2b949d04SAndroid Build Coastguard Worker
262*2b949d04SAndroid Build Coastguard Worker XkbCompositeMap : OptFlags XkbCompositeType OptMapName OBRACE
263*2b949d04SAndroid Build Coastguard Worker XkbMapConfigList
264*2b949d04SAndroid Build Coastguard Worker CBRACE SEMI
265*2b949d04SAndroid Build Coastguard Worker { $$ = XkbFileCreate($2, $3, (ParseCommon *) $5.head, $1); }
266*2b949d04SAndroid Build Coastguard Worker ;
267*2b949d04SAndroid Build Coastguard Worker
268*2b949d04SAndroid Build Coastguard Worker XkbCompositeType: XKB_KEYMAP { $$ = FILE_TYPE_KEYMAP; }
269*2b949d04SAndroid Build Coastguard Worker | XKB_SEMANTICS { $$ = FILE_TYPE_KEYMAP; }
270*2b949d04SAndroid Build Coastguard Worker | XKB_LAYOUT { $$ = FILE_TYPE_KEYMAP; }
271*2b949d04SAndroid Build Coastguard Worker ;
272*2b949d04SAndroid Build Coastguard Worker
273*2b949d04SAndroid Build Coastguard Worker XkbMapConfigList : XkbMapConfigList XkbMapConfig
274*2b949d04SAndroid Build Coastguard Worker { $$.head = $1.head; $$.last->common.next = &$2->common; $$.last = $2; }
275*2b949d04SAndroid Build Coastguard Worker | XkbMapConfig
276*2b949d04SAndroid Build Coastguard Worker { $$.head = $$.last = $1; }
277*2b949d04SAndroid Build Coastguard Worker ;
278*2b949d04SAndroid Build Coastguard Worker
279*2b949d04SAndroid Build Coastguard Worker XkbMapConfig : OptFlags FileType OptMapName OBRACE
280*2b949d04SAndroid Build Coastguard Worker DeclList
281*2b949d04SAndroid Build Coastguard Worker CBRACE SEMI
282*2b949d04SAndroid Build Coastguard Worker {
283*2b949d04SAndroid Build Coastguard Worker $$ = XkbFileCreate($2, $3, $5.head, $1);
284*2b949d04SAndroid Build Coastguard Worker }
285*2b949d04SAndroid Build Coastguard Worker ;
286*2b949d04SAndroid Build Coastguard Worker
287*2b949d04SAndroid Build Coastguard Worker FileType : XKB_KEYCODES { $$ = FILE_TYPE_KEYCODES; }
288*2b949d04SAndroid Build Coastguard Worker | XKB_TYPES { $$ = FILE_TYPE_TYPES; }
289*2b949d04SAndroid Build Coastguard Worker | XKB_COMPATMAP { $$ = FILE_TYPE_COMPAT; }
290*2b949d04SAndroid Build Coastguard Worker | XKB_SYMBOLS { $$ = FILE_TYPE_SYMBOLS; }
291*2b949d04SAndroid Build Coastguard Worker | XKB_GEOMETRY { $$ = FILE_TYPE_GEOMETRY; }
292*2b949d04SAndroid Build Coastguard Worker ;
293*2b949d04SAndroid Build Coastguard Worker
294*2b949d04SAndroid Build Coastguard Worker OptFlags : Flags { $$ = $1; }
295*2b949d04SAndroid Build Coastguard Worker | { $$ = 0; }
296*2b949d04SAndroid Build Coastguard Worker ;
297*2b949d04SAndroid Build Coastguard Worker
298*2b949d04SAndroid Build Coastguard Worker Flags : Flags Flag { $$ = ($1 | $2); }
299*2b949d04SAndroid Build Coastguard Worker | Flag { $$ = $1; }
300*2b949d04SAndroid Build Coastguard Worker ;
301*2b949d04SAndroid Build Coastguard Worker
302*2b949d04SAndroid Build Coastguard Worker Flag : PARTIAL { $$ = MAP_IS_PARTIAL; }
303*2b949d04SAndroid Build Coastguard Worker | DEFAULT { $$ = MAP_IS_DEFAULT; }
304*2b949d04SAndroid Build Coastguard Worker | HIDDEN { $$ = MAP_IS_HIDDEN; }
305*2b949d04SAndroid Build Coastguard Worker | ALPHANUMERIC_KEYS { $$ = MAP_HAS_ALPHANUMERIC; }
306*2b949d04SAndroid Build Coastguard Worker | MODIFIER_KEYS { $$ = MAP_HAS_MODIFIER; }
307*2b949d04SAndroid Build Coastguard Worker | KEYPAD_KEYS { $$ = MAP_HAS_KEYPAD; }
308*2b949d04SAndroid Build Coastguard Worker | FUNCTION_KEYS { $$ = MAP_HAS_FN; }
309*2b949d04SAndroid Build Coastguard Worker | ALTERNATE_GROUP { $$ = MAP_IS_ALTGR; }
310*2b949d04SAndroid Build Coastguard Worker ;
311*2b949d04SAndroid Build Coastguard Worker
312*2b949d04SAndroid Build Coastguard Worker DeclList : DeclList Decl
313*2b949d04SAndroid Build Coastguard Worker {
314*2b949d04SAndroid Build Coastguard Worker if ($2) {
315*2b949d04SAndroid Build Coastguard Worker if ($1.head) {
316*2b949d04SAndroid Build Coastguard Worker $$.head = $1.head; $1.last->next = $2; $$.last = $2;
317*2b949d04SAndroid Build Coastguard Worker } else {
318*2b949d04SAndroid Build Coastguard Worker $$.head = $$.last = $2;
319*2b949d04SAndroid Build Coastguard Worker }
320*2b949d04SAndroid Build Coastguard Worker }
321*2b949d04SAndroid Build Coastguard Worker }
322*2b949d04SAndroid Build Coastguard Worker /*
323*2b949d04SAndroid Build Coastguard Worker * VModDecl is "inlined" directly into DeclList, i.e.
324*2b949d04SAndroid Build Coastguard Worker * each VModDef in the VModDecl is a separate Decl in
325*2b949d04SAndroid Build Coastguard Worker * the File.
326*2b949d04SAndroid Build Coastguard Worker */
327*2b949d04SAndroid Build Coastguard Worker | DeclList OptMergeMode VModDecl
328*2b949d04SAndroid Build Coastguard Worker {
329*2b949d04SAndroid Build Coastguard Worker for (VModDef *vmod = $3.head; vmod; vmod = (VModDef *) vmod->common.next)
330*2b949d04SAndroid Build Coastguard Worker vmod->merge = $2;
331*2b949d04SAndroid Build Coastguard Worker if ($1.head) {
332*2b949d04SAndroid Build Coastguard Worker $$.head = $1.head; $1.last->next = &$3.head->common; $$.last = &$3.last->common;
333*2b949d04SAndroid Build Coastguard Worker } else {
334*2b949d04SAndroid Build Coastguard Worker $$.head = &$3.head->common; $$.last = &$3.last->common;
335*2b949d04SAndroid Build Coastguard Worker }
336*2b949d04SAndroid Build Coastguard Worker }
337*2b949d04SAndroid Build Coastguard Worker | { $$.head = $$.last = NULL; }
338*2b949d04SAndroid Build Coastguard Worker ;
339*2b949d04SAndroid Build Coastguard Worker
340*2b949d04SAndroid Build Coastguard Worker Decl : OptMergeMode VarDecl
341*2b949d04SAndroid Build Coastguard Worker {
342*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
343*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
344*2b949d04SAndroid Build Coastguard Worker }
345*2b949d04SAndroid Build Coastguard Worker /* OptMergeMode VModDecl - see above. */
346*2b949d04SAndroid Build Coastguard Worker | OptMergeMode InterpretDecl
347*2b949d04SAndroid Build Coastguard Worker {
348*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
349*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
350*2b949d04SAndroid Build Coastguard Worker }
351*2b949d04SAndroid Build Coastguard Worker | OptMergeMode KeyNameDecl
352*2b949d04SAndroid Build Coastguard Worker {
353*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
354*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
355*2b949d04SAndroid Build Coastguard Worker }
356*2b949d04SAndroid Build Coastguard Worker | OptMergeMode KeyAliasDecl
357*2b949d04SAndroid Build Coastguard Worker {
358*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
359*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
360*2b949d04SAndroid Build Coastguard Worker }
361*2b949d04SAndroid Build Coastguard Worker | OptMergeMode KeyTypeDecl
362*2b949d04SAndroid Build Coastguard Worker {
363*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
364*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
365*2b949d04SAndroid Build Coastguard Worker }
366*2b949d04SAndroid Build Coastguard Worker | OptMergeMode SymbolsDecl
367*2b949d04SAndroid Build Coastguard Worker {
368*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
369*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
370*2b949d04SAndroid Build Coastguard Worker }
371*2b949d04SAndroid Build Coastguard Worker | OptMergeMode ModMapDecl
372*2b949d04SAndroid Build Coastguard Worker {
373*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
374*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
375*2b949d04SAndroid Build Coastguard Worker }
376*2b949d04SAndroid Build Coastguard Worker | OptMergeMode GroupCompatDecl
377*2b949d04SAndroid Build Coastguard Worker {
378*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
379*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
380*2b949d04SAndroid Build Coastguard Worker }
381*2b949d04SAndroid Build Coastguard Worker | OptMergeMode LedMapDecl
382*2b949d04SAndroid Build Coastguard Worker {
383*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
384*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
385*2b949d04SAndroid Build Coastguard Worker }
386*2b949d04SAndroid Build Coastguard Worker | OptMergeMode LedNameDecl
387*2b949d04SAndroid Build Coastguard Worker {
388*2b949d04SAndroid Build Coastguard Worker $2->merge = $1;
389*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) $2;
390*2b949d04SAndroid Build Coastguard Worker }
391*2b949d04SAndroid Build Coastguard Worker | OptMergeMode ShapeDecl { $$ = NULL; }
392*2b949d04SAndroid Build Coastguard Worker | OptMergeMode SectionDecl { $$ = NULL; }
393*2b949d04SAndroid Build Coastguard Worker | OptMergeMode DoodadDecl { $$ = NULL; }
394*2b949d04SAndroid Build Coastguard Worker | MergeMode STRING
395*2b949d04SAndroid Build Coastguard Worker {
396*2b949d04SAndroid Build Coastguard Worker $$ = (ParseCommon *) IncludeCreate(param->ctx, $2, $1);
397*2b949d04SAndroid Build Coastguard Worker free($2);
398*2b949d04SAndroid Build Coastguard Worker }
399*2b949d04SAndroid Build Coastguard Worker ;
400*2b949d04SAndroid Build Coastguard Worker
401*2b949d04SAndroid Build Coastguard Worker VarDecl : Lhs EQUALS Expr SEMI
402*2b949d04SAndroid Build Coastguard Worker { $$ = VarCreate($1, $3); }
403*2b949d04SAndroid Build Coastguard Worker | Ident SEMI
404*2b949d04SAndroid Build Coastguard Worker { $$ = BoolVarCreate($1, true); }
405*2b949d04SAndroid Build Coastguard Worker | EXCLAM Ident SEMI
406*2b949d04SAndroid Build Coastguard Worker { $$ = BoolVarCreate($2, false); }
407*2b949d04SAndroid Build Coastguard Worker ;
408*2b949d04SAndroid Build Coastguard Worker
409*2b949d04SAndroid Build Coastguard Worker KeyNameDecl : KEYNAME EQUALS KeyCode SEMI
410*2b949d04SAndroid Build Coastguard Worker { $$ = KeycodeCreate($1, $3); }
411*2b949d04SAndroid Build Coastguard Worker ;
412*2b949d04SAndroid Build Coastguard Worker
413*2b949d04SAndroid Build Coastguard Worker KeyAliasDecl : ALIAS KEYNAME EQUALS KEYNAME SEMI
414*2b949d04SAndroid Build Coastguard Worker { $$ = KeyAliasCreate($2, $4); }
415*2b949d04SAndroid Build Coastguard Worker ;
416*2b949d04SAndroid Build Coastguard Worker
417*2b949d04SAndroid Build Coastguard Worker VModDecl : VIRTUAL_MODS VModDefList SEMI
418*2b949d04SAndroid Build Coastguard Worker { $$ = $2; }
419*2b949d04SAndroid Build Coastguard Worker ;
420*2b949d04SAndroid Build Coastguard Worker
421*2b949d04SAndroid Build Coastguard Worker VModDefList : VModDefList COMMA VModDef
422*2b949d04SAndroid Build Coastguard Worker { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
423*2b949d04SAndroid Build Coastguard Worker | VModDef
424*2b949d04SAndroid Build Coastguard Worker { $$.head = $$.last = $1; }
425*2b949d04SAndroid Build Coastguard Worker ;
426*2b949d04SAndroid Build Coastguard Worker
427*2b949d04SAndroid Build Coastguard Worker VModDef : Ident
428*2b949d04SAndroid Build Coastguard Worker { $$ = VModCreate($1, NULL); }
429*2b949d04SAndroid Build Coastguard Worker | Ident EQUALS Expr
430*2b949d04SAndroid Build Coastguard Worker { $$ = VModCreate($1, $3); }
431*2b949d04SAndroid Build Coastguard Worker ;
432*2b949d04SAndroid Build Coastguard Worker
433*2b949d04SAndroid Build Coastguard Worker InterpretDecl : INTERPRET InterpretMatch OBRACE
434*2b949d04SAndroid Build Coastguard Worker VarDeclList
435*2b949d04SAndroid Build Coastguard Worker CBRACE SEMI
436*2b949d04SAndroid Build Coastguard Worker { $2->def = $4.head; $$ = $2; }
437*2b949d04SAndroid Build Coastguard Worker ;
438*2b949d04SAndroid Build Coastguard Worker
439*2b949d04SAndroid Build Coastguard Worker InterpretMatch : KeySym PLUS Expr
440*2b949d04SAndroid Build Coastguard Worker { $$ = InterpCreate($1, $3); }
441*2b949d04SAndroid Build Coastguard Worker | KeySym
442*2b949d04SAndroid Build Coastguard Worker { $$ = InterpCreate($1, NULL); }
443*2b949d04SAndroid Build Coastguard Worker ;
444*2b949d04SAndroid Build Coastguard Worker
445*2b949d04SAndroid Build Coastguard Worker VarDeclList : VarDeclList VarDecl
446*2b949d04SAndroid Build Coastguard Worker { $$.head = $1.head; $$.last->common.next = &$2->common; $$.last = $2; }
447*2b949d04SAndroid Build Coastguard Worker | VarDecl
448*2b949d04SAndroid Build Coastguard Worker { $$.head = $$.last = $1; }
449*2b949d04SAndroid Build Coastguard Worker ;
450*2b949d04SAndroid Build Coastguard Worker
451*2b949d04SAndroid Build Coastguard Worker KeyTypeDecl : TYPE String OBRACE
452*2b949d04SAndroid Build Coastguard Worker VarDeclList
453*2b949d04SAndroid Build Coastguard Worker CBRACE SEMI
454*2b949d04SAndroid Build Coastguard Worker { $$ = KeyTypeCreate($2, $4.head); }
455*2b949d04SAndroid Build Coastguard Worker ;
456*2b949d04SAndroid Build Coastguard Worker
457*2b949d04SAndroid Build Coastguard Worker SymbolsDecl : KEY KEYNAME OBRACE
458*2b949d04SAndroid Build Coastguard Worker SymbolsBody
459*2b949d04SAndroid Build Coastguard Worker CBRACE SEMI
460*2b949d04SAndroid Build Coastguard Worker { $$ = SymbolsCreate($2, $4.head); }
461*2b949d04SAndroid Build Coastguard Worker ;
462*2b949d04SAndroid Build Coastguard Worker
463*2b949d04SAndroid Build Coastguard Worker SymbolsBody : SymbolsBody COMMA SymbolsVarDecl
464*2b949d04SAndroid Build Coastguard Worker { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
465*2b949d04SAndroid Build Coastguard Worker | SymbolsVarDecl
466*2b949d04SAndroid Build Coastguard Worker { $$.head = $$.last = $1; }
467*2b949d04SAndroid Build Coastguard Worker | { $$.head = $$.last = NULL; }
468*2b949d04SAndroid Build Coastguard Worker ;
469*2b949d04SAndroid Build Coastguard Worker
470*2b949d04SAndroid Build Coastguard Worker SymbolsVarDecl : Lhs EQUALS Expr { $$ = VarCreate($1, $3); }
471*2b949d04SAndroid Build Coastguard Worker | Lhs EQUALS ArrayInit { $$ = VarCreate($1, $3); }
472*2b949d04SAndroid Build Coastguard Worker | Ident { $$ = BoolVarCreate($1, true); }
473*2b949d04SAndroid Build Coastguard Worker | EXCLAM Ident { $$ = BoolVarCreate($2, false); }
474*2b949d04SAndroid Build Coastguard Worker | ArrayInit { $$ = VarCreate(NULL, $1); }
475*2b949d04SAndroid Build Coastguard Worker ;
476*2b949d04SAndroid Build Coastguard Worker
477*2b949d04SAndroid Build Coastguard Worker ArrayInit : OBRACKET OptKeySymList CBRACKET
478*2b949d04SAndroid Build Coastguard Worker { $$ = $2; }
479*2b949d04SAndroid Build Coastguard Worker | OBRACKET ActionList CBRACKET
480*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateActionList($2.head); }
481*2b949d04SAndroid Build Coastguard Worker ;
482*2b949d04SAndroid Build Coastguard Worker
483*2b949d04SAndroid Build Coastguard Worker GroupCompatDecl : GROUP Integer EQUALS Expr SEMI
484*2b949d04SAndroid Build Coastguard Worker { $$ = GroupCompatCreate($2, $4); }
485*2b949d04SAndroid Build Coastguard Worker ;
486*2b949d04SAndroid Build Coastguard Worker
487*2b949d04SAndroid Build Coastguard Worker ModMapDecl : MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI
488*2b949d04SAndroid Build Coastguard Worker { $$ = ModMapCreate($2, $4.head); }
489*2b949d04SAndroid Build Coastguard Worker ;
490*2b949d04SAndroid Build Coastguard Worker
491*2b949d04SAndroid Build Coastguard Worker LedMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI
492*2b949d04SAndroid Build Coastguard Worker { $$ = LedMapCreate($2, $4.head); }
493*2b949d04SAndroid Build Coastguard Worker ;
494*2b949d04SAndroid Build Coastguard Worker
495*2b949d04SAndroid Build Coastguard Worker LedNameDecl: INDICATOR Integer EQUALS Expr SEMI
496*2b949d04SAndroid Build Coastguard Worker { $$ = LedNameCreate($2, $4, false); }
497*2b949d04SAndroid Build Coastguard Worker | VIRTUAL INDICATOR Integer EQUALS Expr SEMI
498*2b949d04SAndroid Build Coastguard Worker { $$ = LedNameCreate($3, $5, true); }
499*2b949d04SAndroid Build Coastguard Worker ;
500*2b949d04SAndroid Build Coastguard Worker
501*2b949d04SAndroid Build Coastguard Worker ShapeDecl : SHAPE String OBRACE OutlineList CBRACE SEMI
502*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
503*2b949d04SAndroid Build Coastguard Worker | SHAPE String OBRACE CoordList CBRACE SEMI
504*2b949d04SAndroid Build Coastguard Worker { (void) $4; $$ = NULL; }
505*2b949d04SAndroid Build Coastguard Worker ;
506*2b949d04SAndroid Build Coastguard Worker
507*2b949d04SAndroid Build Coastguard Worker SectionDecl : SECTION String OBRACE SectionBody CBRACE SEMI
508*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
509*2b949d04SAndroid Build Coastguard Worker ;
510*2b949d04SAndroid Build Coastguard Worker
511*2b949d04SAndroid Build Coastguard Worker SectionBody : SectionBody SectionBodyItem { $$ = NULL;}
512*2b949d04SAndroid Build Coastguard Worker | SectionBodyItem { $$ = NULL; }
513*2b949d04SAndroid Build Coastguard Worker ;
514*2b949d04SAndroid Build Coastguard Worker
515*2b949d04SAndroid Build Coastguard Worker SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI
516*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
517*2b949d04SAndroid Build Coastguard Worker | VarDecl
518*2b949d04SAndroid Build Coastguard Worker { FreeStmt((ParseCommon *) $1); $$ = NULL; }
519*2b949d04SAndroid Build Coastguard Worker | DoodadDecl
520*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
521*2b949d04SAndroid Build Coastguard Worker | LedMapDecl
522*2b949d04SAndroid Build Coastguard Worker { FreeStmt((ParseCommon *) $1); $$ = NULL; }
523*2b949d04SAndroid Build Coastguard Worker | OverlayDecl
524*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
525*2b949d04SAndroid Build Coastguard Worker ;
526*2b949d04SAndroid Build Coastguard Worker
527*2b949d04SAndroid Build Coastguard Worker RowBody : RowBody RowBodyItem { $$ = NULL;}
528*2b949d04SAndroid Build Coastguard Worker | RowBodyItem { $$ = NULL; }
529*2b949d04SAndroid Build Coastguard Worker ;
530*2b949d04SAndroid Build Coastguard Worker
531*2b949d04SAndroid Build Coastguard Worker RowBodyItem : KEYS OBRACE Keys CBRACE SEMI { $$ = NULL; }
532*2b949d04SAndroid Build Coastguard Worker | VarDecl
533*2b949d04SAndroid Build Coastguard Worker { FreeStmt((ParseCommon *) $1); $$ = NULL; }
534*2b949d04SAndroid Build Coastguard Worker ;
535*2b949d04SAndroid Build Coastguard Worker
536*2b949d04SAndroid Build Coastguard Worker Keys : Keys COMMA Key { $$ = NULL; }
537*2b949d04SAndroid Build Coastguard Worker | Key { $$ = NULL; }
538*2b949d04SAndroid Build Coastguard Worker ;
539*2b949d04SAndroid Build Coastguard Worker
540*2b949d04SAndroid Build Coastguard Worker Key : KEYNAME
541*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
542*2b949d04SAndroid Build Coastguard Worker | OBRACE ExprList CBRACE
543*2b949d04SAndroid Build Coastguard Worker { FreeStmt((ParseCommon *) $2.head); $$ = NULL; }
544*2b949d04SAndroid Build Coastguard Worker ;
545*2b949d04SAndroid Build Coastguard Worker
546*2b949d04SAndroid Build Coastguard Worker OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
547*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
548*2b949d04SAndroid Build Coastguard Worker ;
549*2b949d04SAndroid Build Coastguard Worker
550*2b949d04SAndroid Build Coastguard Worker OverlayKeyList : OverlayKeyList COMMA OverlayKey { $$ = NULL; }
551*2b949d04SAndroid Build Coastguard Worker | OverlayKey { $$ = NULL; }
552*2b949d04SAndroid Build Coastguard Worker ;
553*2b949d04SAndroid Build Coastguard Worker
554*2b949d04SAndroid Build Coastguard Worker OverlayKey : KEYNAME EQUALS KEYNAME { $$ = NULL; }
555*2b949d04SAndroid Build Coastguard Worker ;
556*2b949d04SAndroid Build Coastguard Worker
557*2b949d04SAndroid Build Coastguard Worker OutlineList : OutlineList COMMA OutlineInList
558*2b949d04SAndroid Build Coastguard Worker { $$ = NULL;}
559*2b949d04SAndroid Build Coastguard Worker | OutlineInList
560*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
561*2b949d04SAndroid Build Coastguard Worker ;
562*2b949d04SAndroid Build Coastguard Worker
563*2b949d04SAndroid Build Coastguard Worker OutlineInList : OBRACE CoordList CBRACE
564*2b949d04SAndroid Build Coastguard Worker { (void) $2; $$ = NULL; }
565*2b949d04SAndroid Build Coastguard Worker | Ident EQUALS OBRACE CoordList CBRACE
566*2b949d04SAndroid Build Coastguard Worker { (void) $4; $$ = NULL; }
567*2b949d04SAndroid Build Coastguard Worker | Ident EQUALS Expr
568*2b949d04SAndroid Build Coastguard Worker { FreeStmt((ParseCommon *) $3); $$ = NULL; }
569*2b949d04SAndroid Build Coastguard Worker ;
570*2b949d04SAndroid Build Coastguard Worker
571*2b949d04SAndroid Build Coastguard Worker CoordList : CoordList COMMA Coord
572*2b949d04SAndroid Build Coastguard Worker { (void) $1; (void) $3; $$ = NULL; }
573*2b949d04SAndroid Build Coastguard Worker | Coord
574*2b949d04SAndroid Build Coastguard Worker { (void) $1; $$ = NULL; }
575*2b949d04SAndroid Build Coastguard Worker ;
576*2b949d04SAndroid Build Coastguard Worker
577*2b949d04SAndroid Build Coastguard Worker Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET
578*2b949d04SAndroid Build Coastguard Worker { $$ = NULL; }
579*2b949d04SAndroid Build Coastguard Worker ;
580*2b949d04SAndroid Build Coastguard Worker
581*2b949d04SAndroid Build Coastguard Worker DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI
582*2b949d04SAndroid Build Coastguard Worker { FreeStmt((ParseCommon *) $4.head); $$ = NULL; }
583*2b949d04SAndroid Build Coastguard Worker ;
584*2b949d04SAndroid Build Coastguard Worker
585*2b949d04SAndroid Build Coastguard Worker DoodadType : TEXT { $$ = 0; }
586*2b949d04SAndroid Build Coastguard Worker | OUTLINE { $$ = 0; }
587*2b949d04SAndroid Build Coastguard Worker | SOLID { $$ = 0; }
588*2b949d04SAndroid Build Coastguard Worker | LOGO { $$ = 0; }
589*2b949d04SAndroid Build Coastguard Worker ;
590*2b949d04SAndroid Build Coastguard Worker
591*2b949d04SAndroid Build Coastguard Worker FieldSpec : Ident { $$ = $1; }
592*2b949d04SAndroid Build Coastguard Worker | Element { $$ = $1; }
593*2b949d04SAndroid Build Coastguard Worker ;
594*2b949d04SAndroid Build Coastguard Worker
595*2b949d04SAndroid Build Coastguard Worker Element : ACTION_TOK
596*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "action"); }
597*2b949d04SAndroid Build Coastguard Worker | INTERPRET
598*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "interpret"); }
599*2b949d04SAndroid Build Coastguard Worker | TYPE
600*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "type"); }
601*2b949d04SAndroid Build Coastguard Worker | KEY
602*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "key"); }
603*2b949d04SAndroid Build Coastguard Worker | GROUP
604*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "group"); }
605*2b949d04SAndroid Build Coastguard Worker | MODIFIER_MAP
606*2b949d04SAndroid Build Coastguard Worker {$$ = xkb_atom_intern_literal(param->ctx, "modifier_map");}
607*2b949d04SAndroid Build Coastguard Worker | INDICATOR
608*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "indicator"); }
609*2b949d04SAndroid Build Coastguard Worker | SHAPE
610*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "shape"); }
611*2b949d04SAndroid Build Coastguard Worker | ROW
612*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "row"); }
613*2b949d04SAndroid Build Coastguard Worker | SECTION
614*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "section"); }
615*2b949d04SAndroid Build Coastguard Worker | TEXT
616*2b949d04SAndroid Build Coastguard Worker { $$ = xkb_atom_intern_literal(param->ctx, "text"); }
617*2b949d04SAndroid Build Coastguard Worker ;
618*2b949d04SAndroid Build Coastguard Worker
619*2b949d04SAndroid Build Coastguard Worker OptMergeMode : MergeMode { $$ = $1; }
620*2b949d04SAndroid Build Coastguard Worker | { $$ = MERGE_DEFAULT; }
621*2b949d04SAndroid Build Coastguard Worker ;
622*2b949d04SAndroid Build Coastguard Worker
623*2b949d04SAndroid Build Coastguard Worker MergeMode : INCLUDE { $$ = MERGE_DEFAULT; }
624*2b949d04SAndroid Build Coastguard Worker | AUGMENT { $$ = MERGE_AUGMENT; }
625*2b949d04SAndroid Build Coastguard Worker | OVERRIDE { $$ = MERGE_OVERRIDE; }
626*2b949d04SAndroid Build Coastguard Worker | REPLACE { $$ = MERGE_REPLACE; }
627*2b949d04SAndroid Build Coastguard Worker | ALTERNATE
628*2b949d04SAndroid Build Coastguard Worker {
629*2b949d04SAndroid Build Coastguard Worker /*
630*2b949d04SAndroid Build Coastguard Worker * This used to be MERGE_ALT_FORM. This functionality was
631*2b949d04SAndroid Build Coastguard Worker * unused and has been removed.
632*2b949d04SAndroid Build Coastguard Worker */
633*2b949d04SAndroid Build Coastguard Worker $$ = MERGE_DEFAULT;
634*2b949d04SAndroid Build Coastguard Worker }
635*2b949d04SAndroid Build Coastguard Worker ;
636*2b949d04SAndroid Build Coastguard Worker
637*2b949d04SAndroid Build Coastguard Worker OptExprList : ExprList { $$ = $1; }
638*2b949d04SAndroid Build Coastguard Worker | { $$.head = $$.last = NULL; }
639*2b949d04SAndroid Build Coastguard Worker ;
640*2b949d04SAndroid Build Coastguard Worker
641*2b949d04SAndroid Build Coastguard Worker ExprList : ExprList COMMA Expr
642*2b949d04SAndroid Build Coastguard Worker { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
643*2b949d04SAndroid Build Coastguard Worker | Expr
644*2b949d04SAndroid Build Coastguard Worker { $$.head = $$.last = $1; }
645*2b949d04SAndroid Build Coastguard Worker ;
646*2b949d04SAndroid Build Coastguard Worker
647*2b949d04SAndroid Build Coastguard Worker Expr : Expr DIVIDE Expr
648*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateBinary(EXPR_DIVIDE, $1, $3); }
649*2b949d04SAndroid Build Coastguard Worker | Expr PLUS Expr
650*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateBinary(EXPR_ADD, $1, $3); }
651*2b949d04SAndroid Build Coastguard Worker | Expr MINUS Expr
652*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateBinary(EXPR_SUBTRACT, $1, $3); }
653*2b949d04SAndroid Build Coastguard Worker | Expr TIMES Expr
654*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateBinary(EXPR_MULTIPLY, $1, $3); }
655*2b949d04SAndroid Build Coastguard Worker | Lhs EQUALS Expr
656*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateBinary(EXPR_ASSIGN, $1, $3); }
657*2b949d04SAndroid Build Coastguard Worker | Term
658*2b949d04SAndroid Build Coastguard Worker { $$ = $1; }
659*2b949d04SAndroid Build Coastguard Worker ;
660*2b949d04SAndroid Build Coastguard Worker
661*2b949d04SAndroid Build Coastguard Worker Term : MINUS Term
662*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateUnary(EXPR_NEGATE, $2->expr.value_type, $2); }
663*2b949d04SAndroid Build Coastguard Worker | PLUS Term
664*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateUnary(EXPR_UNARY_PLUS, $2->expr.value_type, $2); }
665*2b949d04SAndroid Build Coastguard Worker | EXCLAM Term
666*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, $2); }
667*2b949d04SAndroid Build Coastguard Worker | INVERT Term
668*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateUnary(EXPR_INVERT, $2->expr.value_type, $2); }
669*2b949d04SAndroid Build Coastguard Worker | Lhs
670*2b949d04SAndroid Build Coastguard Worker { $$ = $1; }
671*2b949d04SAndroid Build Coastguard Worker | FieldSpec OPAREN OptExprList CPAREN %prec OPAREN
672*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateAction($1, $3.head); }
673*2b949d04SAndroid Build Coastguard Worker | Terminal
674*2b949d04SAndroid Build Coastguard Worker { $$ = $1; }
675*2b949d04SAndroid Build Coastguard Worker | OPAREN Expr CPAREN
676*2b949d04SAndroid Build Coastguard Worker { $$ = $2; }
677*2b949d04SAndroid Build Coastguard Worker ;
678*2b949d04SAndroid Build Coastguard Worker
679*2b949d04SAndroid Build Coastguard Worker ActionList : ActionList COMMA Action
680*2b949d04SAndroid Build Coastguard Worker { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
681*2b949d04SAndroid Build Coastguard Worker | Action
682*2b949d04SAndroid Build Coastguard Worker { $$.head = $$.last = $1; }
683*2b949d04SAndroid Build Coastguard Worker ;
684*2b949d04SAndroid Build Coastguard Worker
685*2b949d04SAndroid Build Coastguard Worker Action : FieldSpec OPAREN OptExprList CPAREN
686*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateAction($1, $3.head); }
687*2b949d04SAndroid Build Coastguard Worker ;
688*2b949d04SAndroid Build Coastguard Worker
689*2b949d04SAndroid Build Coastguard Worker Lhs : FieldSpec
690*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateIdent($1); }
691*2b949d04SAndroid Build Coastguard Worker | FieldSpec DOT FieldSpec
692*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateFieldRef($1, $3); }
693*2b949d04SAndroid Build Coastguard Worker | FieldSpec OBRACKET Expr CBRACKET
694*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateArrayRef(XKB_ATOM_NONE, $1, $3); }
695*2b949d04SAndroid Build Coastguard Worker | FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET
696*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateArrayRef($1, $3, $5); }
697*2b949d04SAndroid Build Coastguard Worker ;
698*2b949d04SAndroid Build Coastguard Worker
699*2b949d04SAndroid Build Coastguard Worker Terminal : String
700*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateString($1); }
701*2b949d04SAndroid Build Coastguard Worker | Integer
702*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateInteger($1); }
703*2b949d04SAndroid Build Coastguard Worker | Float
704*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateFloat(/* Discard $1 */); }
705*2b949d04SAndroid Build Coastguard Worker | KEYNAME
706*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateKeyName($1); }
707*2b949d04SAndroid Build Coastguard Worker ;
708*2b949d04SAndroid Build Coastguard Worker
709*2b949d04SAndroid Build Coastguard Worker OptKeySymList : KeySymList { $$ = $1; }
710*2b949d04SAndroid Build Coastguard Worker | { $$ = NULL; }
711*2b949d04SAndroid Build Coastguard Worker ;
712*2b949d04SAndroid Build Coastguard Worker
713*2b949d04SAndroid Build Coastguard Worker KeySymList : KeySymList COMMA KeySym
714*2b949d04SAndroid Build Coastguard Worker { $$ = ExprAppendKeysymList($1, $3); }
715*2b949d04SAndroid Build Coastguard Worker | KeySymList COMMA KeySyms
716*2b949d04SAndroid Build Coastguard Worker { $$ = ExprAppendMultiKeysymList($1, $3); }
717*2b949d04SAndroid Build Coastguard Worker | KeySym
718*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateKeysymList($1); }
719*2b949d04SAndroid Build Coastguard Worker | KeySyms
720*2b949d04SAndroid Build Coastguard Worker { $$ = ExprCreateMultiKeysymList($1); }
721*2b949d04SAndroid Build Coastguard Worker ;
722*2b949d04SAndroid Build Coastguard Worker
723*2b949d04SAndroid Build Coastguard Worker KeySyms : OBRACE KeySymList CBRACE
724*2b949d04SAndroid Build Coastguard Worker { $$ = $2; }
725*2b949d04SAndroid Build Coastguard Worker ;
726*2b949d04SAndroid Build Coastguard Worker
727*2b949d04SAndroid Build Coastguard Worker KeySym : IDENT
728*2b949d04SAndroid Build Coastguard Worker {
729*2b949d04SAndroid Build Coastguard Worker if (!resolve_keysym($1, &$$)) {
730*2b949d04SAndroid Build Coastguard Worker parser_warn(param, "unrecognized keysym \"%s\"", $1);
731*2b949d04SAndroid Build Coastguard Worker $$ = XKB_KEY_NoSymbol;
732*2b949d04SAndroid Build Coastguard Worker }
733*2b949d04SAndroid Build Coastguard Worker free($1);
734*2b949d04SAndroid Build Coastguard Worker }
735*2b949d04SAndroid Build Coastguard Worker | SECTION { $$ = XKB_KEY_section; }
736*2b949d04SAndroid Build Coastguard Worker | Integer
737*2b949d04SAndroid Build Coastguard Worker {
738*2b949d04SAndroid Build Coastguard Worker if ($1 < 0) {
739*2b949d04SAndroid Build Coastguard Worker parser_warn(param, "unrecognized keysym \"%"PRId64"\"", $1);
740*2b949d04SAndroid Build Coastguard Worker $$ = XKB_KEY_NoSymbol;
741*2b949d04SAndroid Build Coastguard Worker }
742*2b949d04SAndroid Build Coastguard Worker else if ($1 < 10) { /* XKB_KEY_0 .. XKB_KEY_9 */
743*2b949d04SAndroid Build Coastguard Worker $$ = XKB_KEY_0 + (xkb_keysym_t) $1;
744*2b949d04SAndroid Build Coastguard Worker }
745*2b949d04SAndroid Build Coastguard Worker else {
746*2b949d04SAndroid Build Coastguard Worker char buf[32];
747*2b949d04SAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "0x%"PRIx64, $1);
748*2b949d04SAndroid Build Coastguard Worker if (!resolve_keysym(buf, &$$)) {
749*2b949d04SAndroid Build Coastguard Worker parser_warn(param, "unrecognized keysym \"%s\"", buf);
750*2b949d04SAndroid Build Coastguard Worker $$ = XKB_KEY_NoSymbol;
751*2b949d04SAndroid Build Coastguard Worker }
752*2b949d04SAndroid Build Coastguard Worker }
753*2b949d04SAndroid Build Coastguard Worker }
754*2b949d04SAndroid Build Coastguard Worker ;
755*2b949d04SAndroid Build Coastguard Worker
756*2b949d04SAndroid Build Coastguard Worker SignedNumber : MINUS Number { $$ = -$2; }
757*2b949d04SAndroid Build Coastguard Worker | Number { $$ = $1; }
758*2b949d04SAndroid Build Coastguard Worker ;
759*2b949d04SAndroid Build Coastguard Worker
760*2b949d04SAndroid Build Coastguard Worker Number : FLOAT { $$ = $1; }
761*2b949d04SAndroid Build Coastguard Worker | INTEGER { $$ = $1; }
762*2b949d04SAndroid Build Coastguard Worker ;
763*2b949d04SAndroid Build Coastguard Worker
764*2b949d04SAndroid Build Coastguard Worker Float : FLOAT { $$ = 0; }
765*2b949d04SAndroid Build Coastguard Worker ;
766*2b949d04SAndroid Build Coastguard Worker
767*2b949d04SAndroid Build Coastguard Worker Integer : INTEGER { $$ = $1; }
768*2b949d04SAndroid Build Coastguard Worker ;
769*2b949d04SAndroid Build Coastguard Worker
770*2b949d04SAndroid Build Coastguard Worker KeyCode : INTEGER { $$ = $1; }
771*2b949d04SAndroid Build Coastguard Worker ;
772*2b949d04SAndroid Build Coastguard Worker
773*2b949d04SAndroid Build Coastguard Worker Ident : IDENT { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); }
774*2b949d04SAndroid Build Coastguard Worker | DEFAULT { $$ = xkb_atom_intern_literal(param->ctx, "default"); }
775*2b949d04SAndroid Build Coastguard Worker ;
776*2b949d04SAndroid Build Coastguard Worker
777*2b949d04SAndroid Build Coastguard Worker String : STRING { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); }
778*2b949d04SAndroid Build Coastguard Worker ;
779*2b949d04SAndroid Build Coastguard Worker
780*2b949d04SAndroid Build Coastguard Worker OptMapName : MapName { $$ = $1; }
781*2b949d04SAndroid Build Coastguard Worker | { $$ = NULL; }
782*2b949d04SAndroid Build Coastguard Worker ;
783*2b949d04SAndroid Build Coastguard Worker
784*2b949d04SAndroid Build Coastguard Worker MapName : STRING { $$ = $1; }
785*2b949d04SAndroid Build Coastguard Worker ;
786*2b949d04SAndroid Build Coastguard Worker
787*2b949d04SAndroid Build Coastguard Worker %%
788*2b949d04SAndroid Build Coastguard Worker
789*2b949d04SAndroid Build Coastguard Worker XkbFile *
790*2b949d04SAndroid Build Coastguard Worker parse(struct xkb_context *ctx, struct scanner *scanner, const char *map)
791*2b949d04SAndroid Build Coastguard Worker {
792*2b949d04SAndroid Build Coastguard Worker int ret;
793*2b949d04SAndroid Build Coastguard Worker XkbFile *first = NULL;
794*2b949d04SAndroid Build Coastguard Worker struct parser_param param = {
795*2b949d04SAndroid Build Coastguard Worker .scanner = scanner,
796*2b949d04SAndroid Build Coastguard Worker .ctx = ctx,
797*2b949d04SAndroid Build Coastguard Worker .rtrn = NULL,
798*2b949d04SAndroid Build Coastguard Worker .more_maps = false,
799*2b949d04SAndroid Build Coastguard Worker };
800*2b949d04SAndroid Build Coastguard Worker
801*2b949d04SAndroid Build Coastguard Worker /*
802*2b949d04SAndroid Build Coastguard Worker * If we got a specific map, we look for it exclusively and return
803*2b949d04SAndroid Build Coastguard Worker * immediately upon finding it. Otherwise, we need to get the
804*2b949d04SAndroid Build Coastguard Worker * default map. If we find a map marked as default, we return it
805*2b949d04SAndroid Build Coastguard Worker * immediately. If there are no maps marked as default, we return
806*2b949d04SAndroid Build Coastguard Worker * the first map in the file.
807*2b949d04SAndroid Build Coastguard Worker */
808*2b949d04SAndroid Build Coastguard Worker
809*2b949d04SAndroid Build Coastguard Worker while ((ret = yyparse(¶m)) == 0 && param.more_maps) {
810*2b949d04SAndroid Build Coastguard Worker if (map) {
811*2b949d04SAndroid Build Coastguard Worker if (streq_not_null(map, param.rtrn->name))
812*2b949d04SAndroid Build Coastguard Worker return param.rtrn;
813*2b949d04SAndroid Build Coastguard Worker else
814*2b949d04SAndroid Build Coastguard Worker FreeXkbFile(param.rtrn);
815*2b949d04SAndroid Build Coastguard Worker }
816*2b949d04SAndroid Build Coastguard Worker else {
817*2b949d04SAndroid Build Coastguard Worker if (param.rtrn->flags & MAP_IS_DEFAULT) {
818*2b949d04SAndroid Build Coastguard Worker FreeXkbFile(first);
819*2b949d04SAndroid Build Coastguard Worker return param.rtrn;
820*2b949d04SAndroid Build Coastguard Worker }
821*2b949d04SAndroid Build Coastguard Worker else if (!first) {
822*2b949d04SAndroid Build Coastguard Worker first = param.rtrn;
823*2b949d04SAndroid Build Coastguard Worker }
824*2b949d04SAndroid Build Coastguard Worker else {
825*2b949d04SAndroid Build Coastguard Worker FreeXkbFile(param.rtrn);
826*2b949d04SAndroid Build Coastguard Worker }
827*2b949d04SAndroid Build Coastguard Worker }
828*2b949d04SAndroid Build Coastguard Worker param.rtrn = NULL;
829*2b949d04SAndroid Build Coastguard Worker }
830*2b949d04SAndroid Build Coastguard Worker
831*2b949d04SAndroid Build Coastguard Worker if (ret != 0) {
832*2b949d04SAndroid Build Coastguard Worker FreeXkbFile(first);
833*2b949d04SAndroid Build Coastguard Worker return NULL;
834*2b949d04SAndroid Build Coastguard Worker }
835*2b949d04SAndroid Build Coastguard Worker
836*2b949d04SAndroid Build Coastguard Worker if (first)
837*2b949d04SAndroid Build Coastguard Worker log_vrb(ctx, 5,
838*2b949d04SAndroid Build Coastguard Worker "No map in include statement, but \"%s\" contains several; "
839*2b949d04SAndroid Build Coastguard Worker "Using first defined map, \"%s\"\n",
840*2b949d04SAndroid Build Coastguard Worker scanner->file_name, first->name);
841*2b949d04SAndroid Build Coastguard Worker
842*2b949d04SAndroid Build Coastguard Worker return first;
843*2b949d04SAndroid Build Coastguard Worker }
844