]> git.sur5r.net Git - i3/i3/blob - src/cfgparse.y
2cf408a7984e63e292dbe3695b17aa0ba1f162ba
[i3/i3] / src / cfgparse.y
1 %{
2 #include <stdio.h>
3 #include <string.h>
4 #include <xcb/xcb.h>
5
6 enum {
7         BIND_NONE = 0,
8         BIND_SHIFT = XCB_MOD_MASK_SHIFT,        /* (1 << 0) */
9         BIND_CONTROL = XCB_MOD_MASK_CONTROL,    /* (1 << 2) */
10         BIND_MOD1 = XCB_MOD_MASK_1,             /* (1 << 3) */
11         BIND_MOD2 = XCB_MOD_MASK_2,             /* (1 << 4) */
12         BIND_MOD3 = XCB_MOD_MASK_3,             /* (1 << 5) */
13         BIND_MOD4 = XCB_MOD_MASK_4,             /* (1 << 6) */
14         BIND_MOD5 = XCB_MOD_MASK_5,             /* (1 << 7) */
15         BIND_MODE_SWITCH = (1 << 8)
16 };
17
18
19 int yydebug = 1;
20
21 void yyerror(const char *str)
22 {
23         fprintf(stderr,"error: %s\n",str);
24 }
25
26 int yywrap()
27 {
28         return 1;
29 }
30
31 #if 0
32 main()
33 {
34         yyparse();
35         printf("parsing done\n");
36 }
37 #endif
38
39 %}
40
41 %union {
42         int number;
43         char *string;
44 }
45
46 %token <number>NUMBER
47 %token <string>WORD
48 %token <string>STRING
49 %token <string>STRING_NG
50 %token <string>VARNAME
51 %token <string>HEX
52 %token TOKBIND
53 %token TOKBINDSYM
54 %token MODIFIER
55 %token TOKCONTROL
56 %token TOKSHIFT
57 %token WHITESPACE
58 %token TOKFLOATING_MODIFIER
59 %token QUOTEDSTRING
60 %token TOKWORKSPACE
61 %token TOKSCREEN
62 %token TOKASSIGN
63 %token TOKSET
64 %token TOKIPCSOCKET
65 %token TOKEXEC
66 %token TOKCOLOR
67 %token TOKARROW
68
69 %%
70
71 lines: /* empty */
72         | lines WHITESPACE line
73         | lines line
74         ;
75
76 line:
77         bind
78         | bindsym
79         | floating_modifier
80         | workspace
81         | assign
82         | set
83         | ipcsocket
84         | exec
85         | color
86         ;
87
88 command:
89         STRING
90         ;
91
92 bind:
93         TOKBIND WHITESPACE binding_modifiers '+' NUMBER WHITESPACE command
94         {
95                 printf("\tFound binding mod%d with key %d and command %s\n", $<number>3, $5, $<string>7);
96         }
97         ;
98
99 bindsym:
100         TOKBINDSYM WHITESPACE binding_modifiers '+' WORD WHITESPACE command
101         {
102                 printf("\tFound symbolic mod%d with key %s and command %s\n", $<number>3, $5, $<string>7);
103         }
104         ;
105
106 floating_modifier:
107         TOKFLOATING_MODIFIER WHITESPACE binding_modifiers
108         {
109                 printf("\tfloating modifier %d\n", $<number>3);
110         }
111         ;
112
113 workspace:
114         TOKWORKSPACE WHITESPACE NUMBER WHITESPACE TOKSCREEN WHITESPACE screen
115         {
116                 printf("\t workspace %d to screen %d\n", $<number>3, $<number>7);
117         }
118         | TOKWORKSPACE WHITESPACE NUMBER WHITESPACE TOKSCREEN WHITESPACE screen WHITESPACE QUOTEDSTRING
119         {
120                 printf("\t quoted: %s\n", $<string>9);
121         }
122         ;
123
124 screen:
125         NUMBER
126         ;
127
128
129 assign:
130         TOKASSIGN WHITESPACE window_class WHITESPACE optional_arrow NUMBER
131         {
132                 printf("assignment of %s to %d\n", $<string>3, $<number>6);
133         }
134         ;
135
136 window_class:
137         QUOTEDSTRING
138         | STRING_NG
139         ;
140
141 optional_arrow:
142         /* NULL */
143         | TOKARROW WHITESPACE
144         ;
145
146 set:
147         TOKSET WHITESPACE variable WHITESPACE STRING
148         {
149                 printf("set %s to %s\n", $<string>3, $<string>5);
150         }
151         ;
152
153 variable:
154         '$' WORD        { asprintf(&$<string>$, "$%s", $<string>2); }
155         | '$' VARNAME   { asprintf(&$<string>$, "$%s", $<string>2); }
156         ;
157
158 ipcsocket:
159         TOKIPCSOCKET WHITESPACE STRING
160         {
161                 printf("ipc %s\n", $<string>3);
162         }
163         ;
164
165 exec:
166         TOKEXEC WHITESPACE STRING
167         {
168                 printf("exec %s\n", $<string>3);
169         }
170         ;
171
172 color:
173         TOKCOLOR WHITESPACE '#' HEX
174         {
175                 printf("color %s\n", $<string>4);
176         }
177         ;
178
179
180 binding_modifiers:
181         binding_modifier
182         |
183         binding_modifiers '+' binding_modifier
184         {
185                 $<number>$ = $<number>1 | $<number>3;
186         }
187         ;
188
189 binding_modifier:
190         MODIFIER        { $<number>$ = $<number>1; }
191         | TOKCONTROL    { $<number>$ = BIND_CONTROL; }
192         | TOKSHIFT      { $<number>$ = BIND_SHIFT; }
193         ;