1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
%{
#include <stdio.h>
#include <string.h>
#include "libami.h"
void docmd(XEvent *e, void *callback)
{
((void (*)(Window))callback)(e->xany.window);
}
int yyerror(char *s);
extern int yylex (void);
%}
%union
{
int num;
char *ptr;
KeySym keysym;
struct { unsigned int mods; int meta; } modifiers;
void (*function)(Window);
};
%token <num> ERRORTOKEN
%token <num> META MODIFIER WHEREABOUTS COLON BAR
%token <keysym> KEYSYM
%token <function> FUNCTION
%type <num> whereabouts
%type <modifiers> modifiers
%type <function> command
%left BAR
%start bindings
%%
bindings : bindings binding
|
;
binding : modifiers KEYSYM COLON whereabouts COLON command { cx_hotkey($2, $1.mods, $1.meta, $4, docmd, (void*)$6); }
;
modifiers : modifiers MODIFIER { $$.mods=$1.mods|$2; $$.meta=$1.meta; }
| modifiers META { $$.mods=$1.mods; $$.meta=1; }
| { $$.mods=$$.meta=0; }
;
whereabouts : whereabouts BAR whereabouts { $$=$1|$3; }
| WHEREABOUTS { $$=$1; }
;
command : FUNCTION { $$=$1; }
;
%%
char *progname;
int yyerror(s) char *s;
{
fprintf (stderr, "%s: error in input file: %s\n", progname, s ? s : "");
return 0;
}
int main(int argc, char *argv[])
{
char *arg=md_init(argc, argv);
progname=argv[0];
if(arg) {
extern unsigned char *inptr;
inptr=(unsigned char *)arg;
yyparse();
md_main_loop();
}
return 0;
}
|