-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshell.y
More file actions
131 lines (110 loc) · 2.27 KB
/
Copy pathshell.y
File metadata and controls
131 lines (110 loc) · 2.27 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
%token <string_val> WORD
%token NOTOKEN OUTPUT NEWLINE NEW INPUT AOUT BACK AOUTBACK OUTPUTBACK
%union {
char *string_val;
}
%{
extern "C"
{
int yylex();
void yyerror (char const *s);
}
#define yylex yylex
#include <stdio.h>
#include "command.h"
%}
%%
goal:
commands
;
commands:
command
| commands command
;
command: simple_command
;
simple_command:
commands_list iomodifier_opt_list backp NEWLINE {
printf(" Yacc: Execute command\n");
Command::_currentCommand.execute();
}
| NEWLINE
| error NEWLINE { yyerrok; }
;
iomodifier_opt_list:
iomodifier_opt_list iomodifier_opt
| /* can be empty */
;
commands_list:
commands_list NEW command_and_args
| command_and_args
;
command_and_args:
command_word arg_list{
Command::_currentCommand.
insertSimpleCommand( Command::_currentSimpleCommand );
}
;
arg_list:
arg_list argument
| /* can be empty */
;
argument:
WORD {
printf(" Yacc: insert argument \"%s\"\n", $1);
Command::_currentSimpleCommand->wildcardArg( $1 );\
}
;
command_word:
WORD{
printf(" Yacc: insert command \"%s\"\n", $1);
Command::_currentSimpleCommand = new SimpleCommand();
Command::_currentSimpleCommand->insertArgument( $1 );\
}
;
iomodifier_opt:
OUTPUT WORD {
printf(" Yacc: insert output \"%s\"\n", $2);
Command::_currentCommand._outFile = $2;
Command::_currentCommand._out_new = 1;
}
| OUTPUTBACK WORD {
printf(" Yacc: insert output \"%s\"\n", $2);
Command::_currentCommand._outFile = $2;
Command::_currentCommand._errFile = $2;
Command::_currentCommand._out_new = 1;
}
| INPUT WORD {
printf(" Yacc: insert input \"%s\"\n", $2);
Command::_currentCommand._inputFile = $2;
}
| AOUT WORD {
printf(" Yacc: insert output \"%s\"\n", $2);
Command::_currentCommand._outFile = $2;
Command::_currentCommand._out_new = 0;
}
| AOUTBACK WORD {
printf(" Yacc: insert output \"%s\"\n", $2);
Command::_currentCommand._outFile = $2;
Command::_currentCommand._errFile = $2;
Command::_currentCommand._out_new = 0;
}
;
backp :
BACK {
printf(" Yacc: initiate back processing \n");
Command::_currentCommand._background = 1;
}
| /*can be empty*/
;
%%
void yyerror(const char * s)
{
fprintf(stderr,"%s", s);
}
#if 0
main()
{
yyparse();
}
#endif