aboutsummaryrefslogtreecommitdiffstats
path: root/syntax.y
diff options
context:
space:
mode:
Diffstat (limited to 'syntax.y')
-rw-r--r--syntax.y53
1 files changed, 31 insertions, 22 deletions
diff --git a/syntax.y b/syntax.y
index d9d3510..5f33c9a 100644
--- a/syntax.y
+++ b/syntax.y
@@ -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
21line: 27line:
@@ -26,8 +32,8 @@ line:
26runcommand: 32runcommand:
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
53separator:
54 PIPE { $$ = CMD_PIPE; }
55 | AND { $$ = CMD_AND; }
56 | OR { $$ = CMD_OR; }
57 ;
58
47part: 59part:
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
76separator:
77 PIPE { $$ = CMD_TYPE_PIPE; }
78 | AND { $$ = CMD_TYPE_AND; }
79 | OR { $$ = CMD_TYPE_OR; }
80 ; 89 ;
81 90
82%% 91%%