cmdparse.y: set type on the tokens/non-terminals (Thanks Merovius)

This commit is contained in:
Michael Stapelberg 2011-05-05 20:39:05 +02:00
parent 3d1acd6c2f
commit a075fd4ee2
1 changed files with 134 additions and 125 deletions

View File

@ -150,8 +150,17 @@ char *parse_cmd(const char *new) {
%token TOK_CON_ID "con_id" %token TOK_CON_ID "con_id"
%token WHITESPACE "<whitespace>" %token WHITESPACE "<whitespace>"
%token STR "<string>" %token <string> STR "<string>"
%token NUMBER "<number>" %token <number> NUMBER "<number>"
%type <number> direction
%type <chr> level_direction
%type <number> window_mode
%type <number> border_style
%type <number> layout_mode
%type <number> resize_px
%type <number> resize_way
%type <number> resize_tiling
%% %%
@ -254,19 +263,19 @@ matchend:
criteria: criteria:
TOK_CLASS '=' STR TOK_CLASS '=' STR
{ {
printf("criteria: class = %s\n", $<string>3); printf("criteria: class = %s\n", $3);
current_match.class = $<string>3; current_match.class = $3;
} }
| TOK_CON_ID '=' STR | TOK_CON_ID '=' STR
{ {
printf("criteria: id = %s\n", $<string>3); printf("criteria: id = %s\n", $3);
char *end; char *end;
long parsed = strtol($<string>3, &end, 10); long parsed = strtol($3, &end, 10);
if (parsed == LONG_MIN || if (parsed == LONG_MIN ||
parsed == LONG_MAX || parsed == LONG_MAX ||
parsed < 0 || parsed < 0 ||
(end && *end != '\0')) { (end && *end != '\0')) {
ELOG("Could not parse con id \"%s\"\n", $<string>3); ELOG("Could not parse con id \"%s\"\n", $3);
} else { } else {
current_match.con_id = (Con*)parsed; current_match.con_id = (Con*)parsed;
printf("id as int = %p\n", current_match.con_id); printf("id as int = %p\n", current_match.con_id);
@ -274,14 +283,14 @@ criteria:
} }
| TOK_ID '=' STR | TOK_ID '=' STR
{ {
printf("criteria: window id = %s\n", $<string>3); printf("criteria: window id = %s\n", $3);
char *end; char *end;
long parsed = strtol($<string>3, &end, 10); long parsed = strtol($3, &end, 10);
if (parsed == LONG_MIN || if (parsed == LONG_MIN ||
parsed == LONG_MAX || parsed == LONG_MAX ||
parsed < 0 || parsed < 0 ||
(end && *end != '\0')) { (end && *end != '\0')) {
ELOG("Could not parse window id \"%s\"\n", $<string>3); ELOG("Could not parse window id \"%s\"\n", $3);
} else { } else {
current_match.id = parsed; current_match.id = parsed;
printf("window id as int = %d\n", current_match.id); printf("window id as int = %d\n", current_match.id);
@ -289,8 +298,8 @@ criteria:
} }
| TOK_MARK '=' STR | TOK_MARK '=' STR
{ {
printf("criteria: mark = %s\n", $<string>3); printf("criteria: mark = %s\n", $3);
current_match.mark = $<string>3; current_match.mark = $3;
} }
; ;
@ -327,9 +336,9 @@ operation:
exec: exec:
TOK_EXEC WHITESPACE STR TOK_EXEC WHITESPACE STR
{ {
printf("should execute %s\n", $<string>3); printf("should execute %s\n", $3);
start_application($<string>3); start_application($3);
free($<string>3); free($3);
} }
; ;
@ -410,9 +419,9 @@ kill:
workspace: workspace:
TOK_WORKSPACE WHITESPACE STR TOK_WORKSPACE WHITESPACE STR
{ {
printf("should switch to workspace %s\n", $<string>3); printf("should switch to workspace %s\n", $3);
workspace_show($<string>3); workspace_show($3);
free($<string>3); free($3);
} }
; ;
@ -449,8 +458,8 @@ next:
TOK_NEXT WHITESPACE direction TOK_NEXT WHITESPACE direction
{ {
/* TODO: use matches */ /* TODO: use matches */
printf("should select next window in direction %c\n", $<chr>3); printf("should select next window in direction %c\n", $3);
tree_next('n', ($<chr>3 == 'v' ? VERT : HORIZ)); tree_next('n', ($3 == 'v' ? VERT : HORIZ));
} }
; ;
@ -458,8 +467,8 @@ prev:
TOK_PREV WHITESPACE direction TOK_PREV WHITESPACE direction
{ {
/* TODO: use matches */ /* TODO: use matches */
printf("should select prev window in direction %c\n", $<chr>3); printf("should select prev window in direction %c\n", $3);
tree_next('p', ($<chr>3 == 'v' ? VERT : HORIZ)); tree_next('p', ($3 == 'v' ? VERT : HORIZ));
} }
; ;
@ -467,27 +476,27 @@ split:
TOK_SPLIT WHITESPACE direction TOK_SPLIT WHITESPACE direction
{ {
/* TODO: use matches */ /* TODO: use matches */
printf("splitting in direction %c\n", $<chr>3); printf("splitting in direction %c\n", $3);
tree_split(focused, ($<chr>3 == 'v' ? VERT : HORIZ)); tree_split(focused, ($3 == 'v' ? VERT : HORIZ));
} }
; ;
direction: direction:
TOK_HORIZONTAL { $<chr>$ = 'h'; } TOK_HORIZONTAL { $$ = 'h'; }
| 'h' { $<chr>$ = 'h'; } | 'h' { $$ = 'h'; }
| TOK_VERTICAL { $<chr>$ = 'v'; } | TOK_VERTICAL { $$ = 'v'; }
| 'v' { $<chr>$ = 'v'; } | 'v' { $$ = 'v'; }
; ;
mode: mode:
TOK_MODE WHITESPACE window_mode TOK_MODE WHITESPACE window_mode
{ {
if ($<number>3 == TOK_TOGGLE) { if ($3 == TOK_TOGGLE) {
printf("should toggle mode\n"); printf("should toggle mode\n");
toggle_floating_mode(focused, false); toggle_floating_mode(focused, false);
} else { } else {
printf("should switch mode to %s\n", ($<number>3 == TOK_FLOATING ? "floating" : "tiling")); printf("should switch mode to %s\n", ($3 == TOK_FLOATING ? "floating" : "tiling"));
if ($<number>3 == TOK_FLOATING) { if ($3 == TOK_FLOATING) {
floating_enable(focused, false); floating_enable(focused, false);
} else { } else {
floating_disable(focused, false); floating_disable(focused, false);
@ -497,65 +506,65 @@ mode:
; ;
window_mode: window_mode:
TOK_FLOATING { $<number>$ = TOK_FLOATING; } TOK_FLOATING { $$ = TOK_FLOATING; }
| TOK_TILING { $<number>$ = TOK_TILING; } | TOK_TILING { $$ = TOK_TILING; }
| TOK_TOGGLE { $<number>$ = TOK_TOGGLE; } | TOK_TOGGLE { $$ = TOK_TOGGLE; }
; ;
border: border:
TOK_BORDER WHITESPACE border_style TOK_BORDER WHITESPACE border_style
{ {
printf("border style should be changed to %d\n", $<number>3); printf("border style should be changed to %d\n", $3);
owindow *current; owindow *current;
/* check if the match is empty, not if the result is empty */ /* check if the match is empty, not if the result is empty */
if (match_is_empty(&current_match)) if (match_is_empty(&current_match))
focused->border_style = $<number>3; focused->border_style = $3;
else { else {
TAILQ_FOREACH(current, &owindows, owindows) { TAILQ_FOREACH(current, &owindows, owindows) {
printf("matching: %p / %s\n", current->con, current->con->name); printf("matching: %p / %s\n", current->con, current->con->name);
current->con->border_style = $<number>3; current->con->border_style = $3;
} }
} }
} }
; ;
border_style: border_style:
TOK_NORMAL { $<number>$ = BS_NORMAL; } TOK_NORMAL { $$ = BS_NORMAL; }
| TOK_NONE { $<number>$ = BS_NONE; } | TOK_NONE { $$ = BS_NONE; }
| TOK_1PIXEL { $<number>$ = BS_1PIXEL; } | TOK_1PIXEL { $$ = BS_1PIXEL; }
; ;
level: level:
TOK_LEVEL WHITESPACE level_direction TOK_LEVEL WHITESPACE level_direction
{ {
printf("level %c\n", $<chr>3); printf("level %c\n", $3);
if ($<chr>3 == 'u') if ($3 == 'u')
level_up(); level_up();
else level_down(); else level_down();
} }
; ;
level_direction: level_direction:
TOK_UP { $<chr>$ = 'u'; } TOK_UP { $$ = 'u'; }
| TOK_DOWN { $<chr>$ = 'd'; } | TOK_DOWN { $$ = 'd'; }
; ;
move: move:
TOK_MOVE WHITESPACE direction TOK_MOVE WHITESPACE direction
{ {
printf("moving in direction %d\n", $<number>3); printf("moving in direction %d\n", $3);
tree_move($<number>3); tree_move($3);
} }
| TOK_MOVE WHITESPACE TOK_WORKSPACE WHITESPACE STR | TOK_MOVE WHITESPACE TOK_WORKSPACE WHITESPACE STR
{ {
owindow *current; owindow *current;
printf("should move window to workspace %s\n", $<string>5); printf("should move window to workspace %s\n", $5);
/* get the workspace */ /* get the workspace */
Con *ws = workspace_get($<string>5, NULL); Con *ws = workspace_get($5, NULL);
free($<string>5); free($5);
/* check if the match is empty, not if the result is empty */ /* check if the match is empty, not if the result is empty */
if (match_is_empty(&current_match)) if (match_is_empty(&current_match))
@ -572,25 +581,25 @@ move:
restore: restore:
TOK_RESTORE WHITESPACE STR TOK_RESTORE WHITESPACE STR
{ {
printf("restoring \"%s\"\n", $<string>3); printf("restoring \"%s\"\n", $3);
tree_append_json($<string>3); tree_append_json($3);
free($<string>3); free($3);
} }
; ;
layout: layout:
TOK_LAYOUT WHITESPACE layout_mode TOK_LAYOUT WHITESPACE layout_mode
{ {
printf("changing layout to %d\n", $<number>3); printf("changing layout to %d\n", $3);
owindow *current; owindow *current;
/* check if the match is empty, not if the result is empty */ /* check if the match is empty, not if the result is empty */
if (match_is_empty(&current_match)) if (match_is_empty(&current_match))
con_set_layout(focused->parent, $<number>3); con_set_layout(focused->parent, $3);
else { else {
TAILQ_FOREACH(current, &owindows, owindows) { TAILQ_FOREACH(current, &owindows, owindows) {
printf("matching: %p / %s\n", current->con, current->con->name); printf("matching: %p / %s\n", current->con, current->con->name);
con_set_layout(current->con, $<number>3); con_set_layout(current->con, $3);
} }
} }
@ -598,24 +607,24 @@ layout:
; ;
layout_mode: layout_mode:
TOK_DEFAULT { $<number>$ = L_DEFAULT; } TOK_DEFAULT { $$ = L_DEFAULT; }
| TOK_STACKED { $<number>$ = L_STACKED; } | TOK_STACKED { $$ = L_STACKED; }
| TOK_TABBED { $<number>$ = L_TABBED; } | TOK_TABBED { $$ = L_TABBED; }
; ;
mark: mark:
TOK_MARK WHITESPACE STR TOK_MARK WHITESPACE STR
{ {
printf("marking window with str %s\n", $<string>3); printf("marking window with str %s\n", $3);
owindow *current; owindow *current;
/* check if the match is empty, not if the result is empty */ /* check if the match is empty, not if the result is empty */
if (match_is_empty(&current_match)) if (match_is_empty(&current_match))
focused->mark = sstrdup($<string>3); focused->mark = sstrdup($3);
else { else {
TAILQ_FOREACH(current, &owindows, owindows) { TAILQ_FOREACH(current, &owindows, owindows) {
printf("matching: %p / %s\n", current->con, current->con->name); printf("matching: %p / %s\n", current->con, current->con->name);
current->con->mark = sstrdup($<string>3); current->con->mark = sstrdup($3);
} }
} }
@ -627,9 +636,9 @@ nop:
TOK_NOP WHITESPACE STR TOK_NOP WHITESPACE STR
{ {
printf("-------------------------------------------------\n"); printf("-------------------------------------------------\n");
printf(" NOP: %s\n", $<string>3); printf(" NOP: %s\n", $3);
printf("-------------------------------------------------\n"); printf("-------------------------------------------------\n");
free($<string>3); free($3);
} }
; ;
@ -637,11 +646,11 @@ resize:
TOK_RESIZE WHITESPACE resize_way WHITESPACE direction resize_px resize_tiling TOK_RESIZE WHITESPACE resize_way WHITESPACE direction resize_px resize_tiling
{ {
/* resize <grow|shrink> <direction> [<px> px] [or <ppt> ppt] */ /* resize <grow|shrink> <direction> [<px> px] [or <ppt> ppt] */
printf("resizing in way %d, direction %d, px %d or ppt %d\n", $<number>3, $<number>5, $<number>6, $<number>7); printf("resizing in way %d, direction %d, px %d or ppt %d\n", $3, $5, $6, $7);
int direction = $<number>5; int direction = $5;
int px = $<number>6; int px = $6;
int ppt = $<number>7; int ppt = $7;
if ($<number>3 == TOK_SHRINK) { if ($3 == TOK_SHRINK) {
px *= -1; px *= -1;
ppt *= -1; ppt *= -1;
} }
@ -694,33 +703,33 @@ resize:
resize_px: resize_px:
/* empty */ /* empty */
{ {
$<number>$ = 10; $$ = 10;
} }
| WHITESPACE NUMBER WHITESPACE TOK_PX | WHITESPACE NUMBER WHITESPACE TOK_PX
{ {
$<number>$ = $<number>2; $$ = $2;
} }
; ;
resize_tiling: resize_tiling:
/* empty */ /* empty */
{ {
$<number>$ = 10; $$ = 10;
} }
| WHITESPACE TOK_OR WHITESPACE NUMBER WHITESPACE TOK_PPT | WHITESPACE TOK_OR WHITESPACE NUMBER WHITESPACE TOK_PPT
{ {
$<number>$ = $<number>4; $$ = $4;
} }
; ;
resize_way: resize_way:
TOK_GROW { $<number>$ = TOK_GROW; } TOK_GROW { $$ = TOK_GROW; }
| TOK_SHRINK { $<number>$ = TOK_SHRINK; } | TOK_SHRINK { $$ = TOK_SHRINK; }
; ;
direction: direction:
TOK_UP { $<number>$ = TOK_UP; } TOK_UP { $$ = TOK_UP; }
| TOK_DOWN { $<number>$ = TOK_DOWN; } | TOK_DOWN { $$ = TOK_DOWN; }
| TOK_LEFT { $<number>$ = TOK_LEFT; } | TOK_LEFT { $$ = TOK_LEFT; }
| TOK_RIGHT { $<number>$ = TOK_RIGHT; } | TOK_RIGHT { $$ = TOK_RIGHT; }
; ;