]> git.sur5r.net Git - i3/i3/blob - src/cfgparse.y
eab114840c4a8d024249225ffb990c2783a3a927
[i3/i3] / src / cfgparse.y
1 %{
2 #include <stdio.h>
3 #include <string.h>
4 #include <xcb/xcb.h>
5
6 #include "data.h"
7 #include "config.h"
8
9 extern int yylex(void);
10 extern FILE *yyin;
11
12 int yydebug = 1;
13
14 void yyerror(const char *str) {
15         fprintf(stderr,"error: %s\n",str);
16 }
17
18 int yywrap() {
19         return 1;
20 }
21
22 void parse_file(const char *f) {
23         printf("opening %s\n", f);
24         if ((yyin = fopen(f, "r")) == NULL) {
25                 perror("fopen");
26                 exit(1);
27         }
28         if (yyparse() != 0) {
29                 fprintf(stderr, "Could not parse configfile\n");
30                 exit(1);
31         }
32         fclose(yyin);
33 }
34
35 #if 0
36 main()
37 {
38         yyparse();
39         printf("parsing done\n");
40 }
41 #endif
42
43 %}
44
45 %union {
46         int number;
47         char *string;
48         struct Colortriple *color;
49 }
50
51 %token <number>NUMBER
52 %token <string>WORD
53 %token <string>STR
54 %token <string>STR_NG
55 %token <string>VARNAME
56 %token <string>HEX
57 %token TOKBIND
58 %token TOKTERMINAL
59 %token TOKCOMMENT
60 %token TOKFONT
61 %token TOKBINDSYM
62 %token MODIFIER
63 %token TOKCONTROL
64 %token TOKSHIFT
65 %token WHITESPACE
66 %token TOKFLOATING_MODIFIER
67 %token QUOTEDSTRING
68 %token TOKWORKSPACE
69 %token TOKSCREEN
70 %token TOKASSIGN
71 %token TOKSET
72 %token TOKIPCSOCKET
73 %token TOKEXEC
74 %token TOKCOLOR
75 %token TOKARROW
76
77 %%
78
79 lines: /* empty */
80         | lines WHITESPACE line
81         | lines line
82         ;
83
84 line:
85         bind
86         | bindsym
87         | floating_modifier
88         | workspace
89         | assign
90         | set
91         | ipcsocket
92         | exec
93         | color
94         | terminal
95         | font
96         | comment
97         ;
98
99 comment:
100         TOKCOMMENT
101         ;
102
103 command:
104         STR
105         ;
106
107 bind:
108         TOKBIND WHITESPACE binding_modifiers NUMBER WHITESPACE command
109         {
110                 printf("\tFound binding mod%d with key %d and command %s\n", $<number>3, $4, $<string>6);
111         }
112         ;
113
114 bindsym:
115         TOKBINDSYM WHITESPACE binding_modifiers WORD WHITESPACE command
116         {
117                 printf("\tFound symbolic mod%d with key %s and command %s\n", $<number>3, $4, $<string>6);
118         }
119         ;
120
121 floating_modifier:
122         TOKFLOATING_MODIFIER WHITESPACE binding_modifiers
123         {
124                 printf("\tfloating modifier %d\n", $<number>3);
125         }
126         ;
127
128 workspace:
129         TOKWORKSPACE WHITESPACE NUMBER WHITESPACE TOKSCREEN WHITESPACE screen
130         {
131                 printf("\t workspace %d to screen %s\n", $<number>3, $<string>7);
132         }
133         | TOKWORKSPACE WHITESPACE NUMBER WHITESPACE TOKSCREEN WHITESPACE screen WHITESPACE workspace_name
134         {
135                 printf("\t quoted: %s\n", $<string>9);
136         }
137         ;
138
139 workspace_name:
140         QUOTEDSTRING
141         | STR
142         ;
143
144 screen:
145         NUMBER              { asprintf(&$<string>$, "%d", $<number>1); }
146         | NUMBER 'x'        { asprintf(&$<string>$, "%d", $<number>1); }
147         | NUMBER 'x' NUMBER { asprintf(&$<string>$, "%dx%d", $<number>1, $<number>3); }
148         | 'x' NUMBER        { asprintf(&$<string>$, "x%d", $<number>2); }
149         ;
150
151 assign:
152         TOKASSIGN WHITESPACE window_class WHITESPACE optional_arrow NUMBER
153         {
154                 printf("assignment of %s to %d\n", $<string>3, $<number>6);
155         }
156         ;
157
158 window_class:
159         QUOTEDSTRING
160         | STR_NG
161         ;
162
163 optional_arrow:
164         /* NULL */
165         | TOKARROW WHITESPACE
166         ;
167
168 set:
169         TOKSET WHITESPACE variable WHITESPACE STR
170         {
171                 printf("set %s to %s\n", $<string>3, $<string>5);
172         }
173         ;
174
175 variable:
176         '$' WORD        { asprintf(&$<string>$, "$%s", $<string>2); }
177         | '$' VARNAME   { asprintf(&$<string>$, "$%s", $<string>2); }
178         ;
179
180 ipcsocket:
181         TOKIPCSOCKET WHITESPACE STR
182         {
183                 printf("ipc %s\n", $<string>3);
184         }
185         ;
186
187 exec:
188         TOKEXEC WHITESPACE STR
189         {
190                 printf("exec %s\n", $<string>3);
191         }
192         ;
193
194 terminal:
195         TOKTERMINAL WHITESPACE STR
196         {
197                 printf("terminal %s\n", $<string>3);
198         }
199         ;
200
201 font:
202         TOKFONT WHITESPACE STR
203         {
204                 printf("font %s\n", $<string>3);
205         }
206         ;
207
208
209 color:
210         TOKCOLOR WHITESPACE '#' HEX WHITESPACE '#' HEX WHITESPACE '#' HEX
211         {
212                 printf("color %p, %s and %s and %s\n", $<color>1, $<string>4, $<string>7, $<string>10);
213         }
214         ;
215
216
217 binding_modifiers:
218         /* NULL */                               { $<number>$ = 0; }
219         | binding_modifier
220         | binding_modifiers '+' binding_modifier { $<number>$ = $<number>1 | $<number>3; }
221         | binding_modifiers '+'                  { $<number>$ = $<number>1; }
222         ;
223
224 binding_modifier:
225         MODIFIER        { $<number>$ = $<number>1; }
226         | TOKCONTROL    { $<number>$ = BIND_CONTROL; }
227         | TOKSHIFT      { $<number>$ = BIND_SHIFT; }
228         ;