diff options
Diffstat (limited to 'syntax.y')
-rw-r--r-- | syntax.y | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/syntax.y b/syntax.y new file mode 100644 index 0000000..aa0df71 --- /dev/null +++ b/syntax.y | |||
@@ -0,0 +1,50 @@ | |||
1 | %{ | ||
2 | #include "lex.yy.c" | ||
3 | #include "cmd.h" | ||
4 | |||
5 | %} | ||
6 | |||
7 | %union { | ||
8 | char *str; | ||
9 | } | ||
10 | |||
11 | %token <str> WORD STRING | ||
12 | %token NEWLINE CONTINUATION APPEND_OUT REDIRECT_OUT REDIRECT_IN APPEND_OUTPUT_ERR REDIRECT_OUTPUT_ERR PIPE AND OR BACKGROUND HEREDOC UNKNOWN | ||
13 | |||
14 | %% | ||
15 | |||
16 | line: | ||
17 | command NEWLINE { printf("Parsed a command.\n"); } | ||
18 | | NEWLINE { /* empty line */ } | ||
19 | ; | ||
20 | |||
21 | command: | ||
22 | part {printf("PART\n"); } | ||
23 | | part separator command { printf("COMMAND\n"); } | ||
24 | | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); } | ||
25 | | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); } | ||
26 | | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); } | ||
27 | | part BACKGROUND { printf("BACKGROUND\n"); } | ||
28 | ; | ||
29 | |||
30 | tail: | ||
31 | part | ||
32 | | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); } | ||
33 | | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); } | ||
34 | | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); } | ||
35 | ; | ||
36 | |||
37 | part: | ||
38 | part WORD { printf("WORD: %s\n", $2); free($2); } | ||
39 | | part STRING { printf("STRING: %s\n", $2); free($2); } | ||
40 | | WORD { printf("WORD: %s\n", $1); free($1); } | ||
41 | | STRING { printf("STRING: %s\n", $1); free($1); } | ||
42 | ; | ||
43 | |||
44 | separator: | ||
45 | PIPE { printf("PIPE\n"); } | ||
46 | | AND { printf("AND\n"); } | ||
47 | | OR { printf("OR\n"); } | ||
48 | ; | ||
49 | |||
50 | %% \ No newline at end of file | ||