diff options
Diffstat (limited to 'syntax.y')
-rw-r--r-- | syntax.y | 80 |
1 files changed, 54 insertions, 26 deletions
@@ -1,50 +1,78 @@ | |||
1 | %{ | 1 | %{ |
2 | #include "lex.yy.c" | ||
3 | #include "cmd.h" | 2 | #include "cmd.h" |
4 | 3 | #include "lex.yy.c" | |
5 | %} | 4 | %} |
6 | 5 | ||
7 | %union { | 6 | %union { |
8 | char *str; | 7 | char *str; |
8 | struct Command *cmd; | ||
9 | CommandType cmdType; | ||
9 | } | 10 | } |
10 | 11 | ||
11 | %token <str> WORD STRING | 12 | %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 | %token NEWLINE PIPE AND OR |
14 | |||
15 | %type <cmd> line command part | ||
16 | %type <cmdType> separator | ||
13 | 17 | ||
14 | %% | 18 | %% |
15 | 19 | ||
16 | line: | 20 | line: |
17 | command NEWLINE { printf("Parsed a command.\n"); } | 21 | command NEWLINE { $$ = $1; runcmd($$); } |
18 | | NEWLINE { /* empty line */ } | 22 | | NEWLINE { $$ = NULL; } |
19 | ; | 23 | ; |
20 | 24 | ||
21 | command: | 25 | command: |
22 | part {printf("PART\n"); } | 26 | part { $$ = $1; } |
23 | | part separator command { printf("COMMAND\n"); } | 27 | | part separator command { |
24 | | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); } | 28 | $$ = malloc(sizeof(Command)); |
25 | | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); } | 29 | $$->type = $2; |
26 | | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); } | 30 | $$->left = $1; |
27 | | part BACKGROUND { printf("BACKGROUND\n"); } | 31 | $$->right = $3; |
28 | ; | 32 | } |
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 | ; | 33 | ; |
36 | 34 | ||
37 | part: | 35 | part: |
38 | part WORD { printf("WORD: %s\n", $2); free($2); } | 36 | part WORD { |
39 | | part STRING { printf("STRING: %s\n", $2); free($2); } | 37 | $$ = $1; |
40 | | WORD { printf("WORD: %s\n", $1); free($1); } | 38 | $$->argc++; |
41 | | STRING { printf("STRING: %s\n", $1); free($1); } | 39 | $$->args = realloc($$->args, ($$->argc) * sizeof(char *)); |
40 | $$->args[$$->argc - 1] = $2; | ||
41 | $$->args[$$->argc] = NULL; | ||
42 | printf("word[%d] = %s\n", $$->argc-1,$$->args[$$->argc-1]); | ||
43 | } | ||
44 | | part STRING { | ||
45 | $$ = $1; | ||
46 | $$->argc++; | ||
47 | $$->args = realloc($$->args, ($$->argc) * sizeof(char *)); | ||
48 | $$->args[$$->argc - 1] = $2; | ||
49 | $$->args[$$->argc] = NULL; | ||
50 | } | ||
51 | | WORD { | ||
52 | $$ = malloc(sizeof(Command)); | ||
53 | $$->type = CMD_TYPE_NORMAL; | ||
54 | $$->args = malloc(2 * sizeof(char *)); | ||
55 | $$->args[0] = $1; | ||
56 | $$->args[1] = NULL; | ||
57 | $$->argc = 1; | ||
58 | printf("word[%d] = %s\n", $$->argc-1,$$->args[$$->argc-1]); | ||
59 | $$->left = $$->right = NULL; | ||
60 | } | ||
61 | | STRING { | ||
62 | $$ = malloc(sizeof(Command)); | ||
63 | $$->type = CMD_TYPE_NORMAL; | ||
64 | $$->args = malloc(2 * sizeof(char *)); | ||
65 | $$->args[0] = $1; | ||
66 | $$->args[1] = NULL; | ||
67 | $$->argc = 1; | ||
68 | $$->left = $$->right = NULL; | ||
69 | } | ||
42 | ; | 70 | ; |
43 | 71 | ||
44 | separator: | 72 | separator: |
45 | PIPE { printf("PIPE\n"); } | 73 | PIPE { $$ = CMD_TYPE_PIPE; } |
46 | | AND { printf("AND\n"); } | 74 | | AND { $$ = CMD_TYPE_AND; } |
47 | | OR { printf("OR\n"); } | 75 | | OR { $$ = CMD_TYPE_OR; } |
48 | ; | 76 | ; |
49 | 77 | ||
50 | %% \ No newline at end of file | 78 | %% |