1%{
2/* arparse.y - Stange script language parser */
3
4/*   Copyright 1992, 1993, 1995, 1997, 1999, 2002, 2003, 2007
5     Free Software Foundation, Inc.
6
7This file is part of GNU Binutils.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 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"
32extern int verbose;
33extern int yylex (void);
34static int yyerror (const char *);
35%}
36
37%union {
38  char *name;
39struct 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
67start:
68	{ prompt(); } session
69	;
70
71session:
72	    session command_line
73	|
74	;
75
76command_line:
77		command NEWLINE { prompt(); }
78	;
79
80command:
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
100extract_command:
101                EXTRACT modulename
102		{ ar_extract($2); }
103	;
104
105replace_command:
106		REPLACE modulename
107		{ ar_replace($2); }
108	;
109
110clear_command:
111		CLEAR
112		{ ar_clear(); }
113	;
114
115delete_command:
116		DELETE modulename
117		{ ar_delete($2); }
118	;
119addmod_command:
120	ADDMOD modulename
121		{ ar_addmod($2); }
122	;
123
124list_command:
125		LIST
126		{ ar_list(); }
127	;
128
129save_command:
130		SAVE
131		{ ar_save(); }
132	;
133
134
135
136open_command:
137		OPEN FILENAME
138		{ ar_open($2,0); }
139	;
140
141create_command:
142		CREATE FILENAME
143		{ ar_open($2,1); }
144	;
145
146
147addlib_command:
148		ADDLIB FILENAME modulelist
149		{ ar_addlib($2,$3); }
150	;
151directory_command:
152		DIRECTORY FILENAME modulelist optional_filename
153		{ ar_directory($2, $3, $4); }
154	;
155
156
157
158optional_filename:
159		FILENAME
160		{ $$ = $1; }
161	|	{ $$ = 0; }
162	;
163
164modulelist:
165	'(' modulename ')'
166		{ $$ = $2; }
167	|
168		{ $$ = 0; }
169	;
170
171modulename:
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
182optcomma:
183		','
184	|
185	;
186
187
188verbose_command:
189	VERBOSE
190		{ verbose = !verbose; }
191	;
192
193
194%%
195
196static int
197yyerror (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