blob: aa0df7173057eab986f1f7063ebe986fe007bb43 (
plain) (
blame)
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
|
%{
#include "lex.yy.c"
#include "cmd.h"
%}
%union {
char *str;
}
%token <str> WORD STRING
%token NEWLINE CONTINUATION APPEND_OUT REDIRECT_OUT REDIRECT_IN APPEND_OUTPUT_ERR REDIRECT_OUTPUT_ERR PIPE AND OR BACKGROUND HEREDOC UNKNOWN
%%
line:
command NEWLINE { printf("Parsed a command.\n"); }
| NEWLINE { /* empty line */ }
;
command:
part {printf("PART\n"); }
| part separator command { printf("COMMAND\n"); }
| part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); }
| part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); }
| part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); }
| part BACKGROUND { printf("BACKGROUND\n"); }
;
tail:
part
| part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); }
| part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); }
| part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); }
;
part:
part WORD { printf("WORD: %s\n", $2); free($2); }
| part STRING { printf("STRING: %s\n", $2); free($2); }
| WORD { printf("WORD: %s\n", $1); free($1); }
| STRING { printf("STRING: %s\n", $1); free($1); }
;
separator:
PIPE { printf("PIPE\n"); }
| AND { printf("AND\n"); }
| OR { printf("OR\n"); }
;
%%
|