aboutsummaryrefslogtreecommitdiffstats
path: root/syntax.y
blob: aa0df7173057eab986f1f7063ebe986fe007bb43 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
%{
#include "lex.yy.c"
#include "cmd.h"

%}

%union {
    char *str;
}

%token <str> WORD STRING
%token NEWLINE CONTINUATION APPEND_OUT REDIRECT_OUT REDIRECT_IN APPEND_OUTPUT_ERR REDIRECT_OUTPUT_ERR PIPE AND OR BACKGROUND HEREDOC UNKNOWN

%%

line:
    command NEWLINE { printf("Parsed a command.\n"); }
    | NEWLINE { /* empty line */ }
    ;

command:
    part {printf("PART\n"); }
    | part separator command { printf("COMMAND\n"); }
    | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); }
    | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); }
    | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); }
    | part BACKGROUND { printf("BACKGROUND\n"); }
    ;

tail:
    part
    | part REDIRECT_OUT WORD tail { printf("REDIRECT_OUT: %s\n", $3); free($3); }
    | part REDIRECT_IN WORD tail { printf("REDIRECT_IN: %s\n", $3); free($3); }
    | part HEREDOC WORD tail { printf("HEREDOC: %s\n", $3); free($3); }
    ;

part:
    part WORD { printf("WORD: %s\n", $2); free($2); }
    | part STRING { printf("STRING: %s\n", $2); free($2); }
    | WORD { printf("WORD: %s\n", $1); free($1); }
    | STRING { printf("STRING: %s\n", $1); free($1); }
    ;

separator:
    PIPE { printf("PIPE\n"); }
    | AND { printf("AND\n"); }
    | OR { printf("OR\n"); }
    ;

%%