1 %{
2 /* arparse.y - Strange script language parser */
3 
4 /* Copyright (C) 1992-2020 Free Software Foundation, Inc.
5 
6    This file is part of GNU Binutils.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 
24 /* Contributed by Steve Chamberlain
25    		  sac@cygnus.com
26 
27 */
28 #define DONTDECLARE_MALLOC
29 #include "sysdep.h"
30 #include "bfd.h"
31 #include "arsup.h"
32 extern int verbose;
33 extern int yylex (void);
34 static int yyerror (const char *);
35 %}
36 
37 %union {
38   char *name;
39 struct list *list ;
40 
41 };
42 
43 %token NEWLINE
44 %token VERBOSE
45 %token <name> FILENAME
46 %token ADDLIB
47 %token LIST
48 %token ADDMOD
49 %token CLEAR
50 %token CREATE
51 %token DELETE
52 %token DIRECTORY
53 %token END
54 %token EXTRACT
55 %token FULLDIR
56 %token HELP
57 %token QUIT
58 %token REPLACE
59 %token SAVE
60 %token OPEN
61 
62 %type <list> modulelist
63 %type <list> modulename
64 %type <name> optional_filename
65 %%
66 
67 start:
68 	{ prompt(); } session
69 	;
70 
71 session:
72 	    session command_line
73 	|
74 	;
75 
76 command_line:
77 		command NEWLINE { prompt(); }
78 	;
79 
80 command:
81 		open_command
82 	|	create_command
83 	| 	verbose_command
84 	|	directory_command
85 	|	addlib_command
86 	|	clear_command
87 	|	addmod_command
88 	| 	save_command
89         |       extract_command
90 	|	replace_command
91 	|	delete_command
92 	|	list_command
93 	| 	END	 { ar_end(); return 0; }
94 	| 	error
95 	|       FILENAME { yyerror("foo"); }
96 	|
97 	;
98 
99 
100 extract_command:
101                 EXTRACT modulename
102 		{ ar_extract($2); }
103 	;
104 
105 replace_command:
106 		REPLACE modulename
107 		{ ar_replace($2); }
108 	;
109 
110 clear_command:
111 		CLEAR
112 		{ ar_clear(); }
113 	;
114 
115 delete_command:
116 		DELETE modulename
117 		{ ar_delete($2); }
118 	;
119 addmod_command:
120 	ADDMOD modulename
121 		{ ar_addmod($2); }
122 	;
123 
124 list_command:
125 		LIST
126 		{ ar_list(); }
127 	;
128 
129 save_command:
130 		SAVE
131 		{ ar_save(); }
132 	;
133 
134 
135 
136 open_command:
137 		OPEN FILENAME
138 		{ ar_open($2,0); }
139 	;
140 
141 create_command:
142 		CREATE FILENAME
143 		{ ar_open($2,1); }
144 	;
145 
146 
147 addlib_command:
148 		ADDLIB FILENAME modulelist
149 		{ ar_addlib($2,$3); }
150 	;
151 directory_command:
152 		DIRECTORY FILENAME modulelist optional_filename
153 		{ ar_directory($2, $3, $4); }
154 	;
155 
156 
157 
158 optional_filename:
159 		FILENAME
160 		{ $$ = $1; }
161 	|	{ $$ = 0; }
162 	;
163 
164 modulelist:
165 	'(' modulename ')'
166 		{ $$ = $2; }
167 	|
168 		{ $$ = 0; }
169 	;
170 
171 modulename:
172 		modulename optcomma FILENAME
173 		{ 	struct list *n  = (struct list *) malloc(sizeof(struct list));
174 			n->next = $1;
175 			n->name = $3;
176 			$$ = n;
177 		 }
178 	|	{ $$ = 0; }
179 	;
180 
181 
182 optcomma:
183 		','
184 	|
185 	;
186 
187 
188 verbose_command:
189 	VERBOSE
190 		{ verbose = !verbose; }
191 	;
192 
193 
194 %%
195 
196 static int
197 yyerror (const char *x ATTRIBUTE_UNUSED)
198 {
199   extern int linenumber;
200 
201   printf (_("Syntax error in archive script, line %d\n"), linenumber + 1);
202   return 0;
203 }
204