Blob


1 /* -*- mode: fundamental; indent-tabs-mode: t; -*- */
2 %{
4 /*
5 * Copyright (c) 2020 Omar Polo <op@omarpolo.com>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
20 #include <stdio.h>
22 #include "star-platinum.h"
24 /*
25 * #define YYDEBUG 1
26 * int yydebug = 1;
27 */
29 #define SPECIAL(X) ((struct action){.type = (ASPECIAL), .special = (X) })
30 #define FAKE_KEY(K) ((struct action){.type = (AFAKE), .send_key = (K) })
31 #define EXEC(S) ((struct action){.type = (AEXEC), .str = (S) })
33 %}
35 %union {
36 struct key key;
37 char *str;
38 struct action action;
39 struct match *match;
40 struct rule *rule;
41 struct group *group;
42 }
44 %token TMATCH TCLASS TALL
45 %token TON TDO
46 %token TTOGGLE TACTIVATE TDEACTIVATE TIGNORE TEXEC
47 %token TERR
49 %token <key> TKEY
50 %token <str> TSTRING
52 %type <action> action
53 %type <match> matches match
54 %type <rule> keys key
55 %type <group> groups group
57 %%
59 groups : /* empty */ { $$ = NULL; }
60 | groups group { $2->next = $1; config = $$ = $2; }
61 | error '\n'
62 ;
64 group : matches keys { $$ = new_group($1, $2); }
65 ;
67 matches : /* empty */ { $$ = NULL; }
68 | matches '\n' { $$ = $1; }
69 | matches match '\n' { $2->next = $1; $$ = $2; }
70 ;
72 match : TMATCH TALL { $$ = new_match(MANY, NULL); }
73 | TMATCH TCLASS TSTRING { $$ = new_match(MCLASS, $3); }
74 ;
76 keys : /* empty */ { $$ = NULL; }
77 | keys '\n' { $$ = $1; }
78 | keys key '\n' { $2->next = $1; $$ = $2; }
79 ;
81 key : TON TKEY TDO action { $$ = new_rule($2, $4); }
82 ;
84 action : TKEY { $$ = FAKE_KEY($1); }
85 | TTOGGLE { $$ = SPECIAL(ATOGGLE); }
86 | TACTIVATE { $$ = SPECIAL(AACTIVATE); }
87 | TDEACTIVATE { $$ = SPECIAL(ADEACTIVATE); }
88 | TIGNORE { $$ = SPECIAL(AIGNORE); }
89 | TEXEC TSTRING { $$ = EXEC($2); }
90 ;