aboutsummaryrefslogtreecommitdiffstats
path: root/syntax.y
diff options
context:
space:
mode:
Diffstat (limited to 'syntax.y')
-rw-r--r--syntax.y80
1 files changed, 54 insertions, 26 deletions
diff --git a/syntax.y b/syntax.y
index aa0df71..1ce2223 100644
--- a/syntax.y
+++ b/syntax.y
@@ -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
16line: 20line:
17 command NEWLINE { printf("Parsed a command.\n"); } 21 command NEWLINE { $$ = $1; runcmd($$); }
18 | NEWLINE { /* empty line */ } 22 | NEWLINE { $$ = NULL; }
19 ; 23 ;
20 24
21command: 25command:
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
30tail:
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
37part: 35part:
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
44separator: 72separator:
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%%