commit - e0041ee5139dcd4173fe8f47ff691c0d41951341
commit + 7d3286caede96d7b813eff7dc3691d683d0f9bf9
blob - 943a39c29b407715da6bf55e5a0d43d66ee83837
blob + 92aadc8434cd61b0831ea6b5c8170b9d8713e985
--- lex.l
+++ lex.l
-/* -*- mode:fundamental; indent-tabs-mode: t; -*- */
+/* -*- mode:c; indent-tabs-mode: t; -*- */
%{
/*
%x COMMENT
%x KEY
+%x STRING
%%
-"#" { BEGIN(COMMENT); }
-<COMMENT>\n { yylineno++; BEGIN(INITIAL); }
-<COMMENT>. ;
+<INITIAL># BEGIN(COMMENT);
+<COMMENT>.*\n yylineno++; BEGIN(INITIAL); return '\n';
-[ \t\r\v\f]+ ;
+<INITIAL>\" BEGIN(KEY);
+<KEY>\" {
+ BEGIN(INITIAL);
+ yylval.key = (struct key){ state, key };
+ state = 0;
+ key = 0;
+ return TKEY;
+ }
-"match" return TMATCH;
-"class" return TCLASS;
-"on" return TON;
-"do" return TDO;
-"toggle" return TTOGGLE;
-"activate" return TACTIVATE;
-"deactivate" return TDEACTIVATE;
-"ignore" return TIGNORE;
+<KEY>C- state |= ControlMask;
+<KEY>S- state |= ShiftMask;
+<KEY>M- state |= Mod1Mask;
+<KEY>s- state |= Mod4Mask;
-"\n" yylineno++; return '\n';
-"*" return '*';
+<KEY><[^>]+> {
+ char *c;
-[-a-zA-Z0-9]+ {
- char *ident;
- if ((ident = strdup(yytext)) == NULL)
- err(1, "strdup");
- yylval.str = ident;
- return TSTRING;
- }
+ if ((c = strdup(yytext)) == NULL)
+ err(1, "strdup");
-"\"" { BEGIN(KEY); }
-<KEY>"\"" {
- BEGIN(INITIAL);
+ c++; /* skip the < */
+ c[strlen(c)-1] = '\0'; /* trim the > */
- yylval.key = (struct key){ state, key };
- state = 0;
- key = 0;
- return TKEY;
- }
+ if ((key = XStringToKeysym(c)) == NoSymbol)
+ yyerror("invalid keysym %s", c);
-<KEY>C- { state |= ControlMask; }
-<KEY>S- { state |= ShiftMask; }
-<KEY>M- { state |= Mod1Mask; }
-<KEY>s- { state |= Mod4Mask; }
+ free(--c);
+ }
-<KEY><[^>]+> {
- char *c;
+<KEY>SPC key = XK_space;
+<KEY>RET key = XK_Return;
- if ((c = strdup(yytext)) == NULL)
- err(1, "strdup");
+<KEY>"(" key = XK_parenleft;
+<KEY>")" key = XK_parenright;
- c++; /* skip the < */
- c[strlen(c)-1] = '\0'; /* trim the > */
+<KEY>. {
+ if ((key = XStringToKeysym(yytext)) == NoSymbol)
+ yyerror("invalid key %s", yytext);
+ }
- if ((key = XStringToKeysym(c)) == NoSymbol)
- yyerror("invalid keysym %s", c);
+<INITIAL>\' BEGIN(STRING);
+<STRING>[^']*\' {
+ if ((yylval.str = strdup(yytext)) == NULL)
+ err(1, "strdup");
+ yylval.str[strlen(yylval.str)-1] = '\0'; /* remove the closing quote */
+ BEGIN(INITIAL);
+ return TSTRING;
+ }
- free(--c);
- }
+match return TMATCH;
+class return TCLASS;
+on return TON;
+do return TDO;
+toggle return TTOGGLE;
+activate return TACTIVATE;
+deactivate return TDEACTIVATE;
+ignore return TIGNORE;
+exec return TEXEC;
+all return TALL;
-<KEY>SPC { key = XK_space; }
-<KEY>RET { key = XK_Return; }
+\n yylineno++; return '\n';
+[ \r\t\f]+
-<KEY>"(" { key = XK_parenleft; }
-<KEY>")" { key = XK_parenright; }
+. return TERR;
-<KEY>. {
- if ((key = XStringToKeysym(yytext)) == NoSymbol)
- yyerror("invalid key %s", yytext);
- }
-
-
%%
int
blob - 32657d48a66e7b0a1bac2addbf2a5e8efdcbe614
blob + 68bb6d1db282d70709de7d07b094a10d72e3aa5a
--- parse.y
+++ parse.y
struct group *group;
}
-%token TMATCH TCLASS
+%token TMATCH TCLASS TALL
%token TON TDO
%token TTOGGLE TACTIVATE TDEACTIVATE TIGNORE TEXEC
%token TERR
| matches match '\n' { $2->next = $1; $$ = $2; }
;
-match : TMATCH '*' { $$ = new_match(MANY, NULL); }
+match : TMATCH TALL { $$ = new_match(MANY, NULL); }
| TMATCH TCLASS TSTRING { $$ = new_match(MCLASS, $3); }
;