diff options
Diffstat (limited to 'syntax.y')
-rw-r--r-- | syntax.y | 53 |
1 files changed, 31 insertions, 22 deletions
@@ -8,14 +8,20 @@ | |||
8 | char *str; | 8 | char *str; |
9 | struct Command *cmd; | 9 | struct Command *cmd; |
10 | CommandType cmdType; | 10 | CommandType cmdType; |
11 | int fd; | ||
11 | } | 12 | } |
12 | 13 | ||
13 | %token <str> WORD STRING error | 14 | %token <str> WORD STRING error FD_REDIRECT |
14 | %token NEWLINE PIPE AND OR | 15 | %token NEWLINE PIPE AND OR REDIRECT_IN REDIRECT_OUT BACKGROUND |
15 | 16 | ||
16 | %type <cmd> line command part runcommand | 17 | %type <cmd> line command part runcommand |
17 | %type <cmdType> separator | 18 | %type <cmdType> separator |
18 | 19 | ||
20 | %locations | ||
21 | %nonassoc WORD | ||
22 | %nonassoc BACKGROUND | ||
23 | %nonassoc REDIRECT_IN REDIRECT_OUT | ||
24 | |||
19 | %% | 25 | %% |
20 | 26 | ||
21 | line: | 27 | line: |
@@ -26,8 +32,8 @@ line: | |||
26 | runcommand: | 32 | runcommand: |
27 | command NEWLINE { | 33 | command NEWLINE { |
28 | $$ = $1; | 34 | $$ = $1; |
29 | printf("running command: \n"); | ||
30 | runcmd($$); | 35 | runcmd($$); |
36 | showPrompt(); | ||
31 | } | 37 | } |
32 | | NEWLINE { $$ = NULL; } | 38 | | NEWLINE { $$ = NULL; } |
33 | ; | 39 | ; |
@@ -44,18 +50,17 @@ command: | |||
44 | } | 50 | } |
45 | ; | 51 | ; |
46 | 52 | ||
53 | separator: | ||
54 | PIPE { $$ = CMD_PIPE; } | ||
55 | | AND { $$ = CMD_AND; } | ||
56 | | OR { $$ = CMD_OR; } | ||
57 | ; | ||
58 | |||
47 | part: | 59 | part: |
48 | part WORD { | 60 | part WORD { |
49 | $$ = $1; | 61 | $$ = $1; |
50 | $$->argc++; | 62 | $$->argc++; |
51 | $$->args = realloc($$->args, ($$->argc) * sizeof(char *)); | 63 | $$->args = realloc($$->args, ($$->argc + 1) * sizeof(char *)); |
52 | $$->args[$$->argc - 1] = $2; | ||
53 | $$->args[$$->argc] = NULL; | ||
54 | } | ||
55 | | part STRING { | ||
56 | $$ = $1; | ||
57 | $$->argc++; | ||
58 | $$->args = realloc($$->args, ($$->argc) * sizeof(char *)); | ||
59 | $$->args[$$->argc - 1] = $2; | 64 | $$->args[$$->argc - 1] = $2; |
60 | $$->args[$$->argc] = NULL; | 65 | $$->args[$$->argc] = NULL; |
61 | } | 66 | } |
@@ -65,18 +70,22 @@ part: | |||
65 | $$->args[$$->argc++] = $1; | 70 | $$->args[$$->argc++] = $1; |
66 | $$->args[$$->argc] = NULL; | 71 | $$->args[$$->argc] = NULL; |
67 | } | 72 | } |
68 | | STRING { | 73 | | part REDIRECT_IN WORD { |
69 | $$ = newcmd(); | 74 | $$ = $1; |
70 | $$->args = malloc(2 * sizeof(char *)); | 75 | $$->redirectFile[0] = $3; |
71 | $$->args[$$->argc++] = $1; | 76 | } |
72 | $$->args[$$->argc] = NULL; | 77 | | part REDIRECT_OUT WORD { |
78 | $$ = $1; | ||
79 | $$->redirectFile[1] = $3; | ||
80 | } | ||
81 | | part FD_REDIRECT { | ||
82 | $$ = $1; | ||
83 | $$->redirectFD[$2[0]-'0']=$2[3]-'0'; | ||
84 | } | ||
85 | | part BACKGROUND { | ||
86 | $$ = $1; | ||
87 | $$->background = true; | ||
73 | } | 88 | } |
74 | ; | ||
75 | |||
76 | separator: | ||
77 | PIPE { $$ = CMD_TYPE_PIPE; } | ||
78 | | AND { $$ = CMD_TYPE_AND; } | ||
79 | | OR { $$ = CMD_TYPE_OR; } | ||
80 | ; | 89 | ; |
81 | 90 | ||
82 | %% | 91 | %% |