| %{ | 
 | /* arparse.y - Strange script language parser */ | 
 |  | 
 | /* Copyright (C) 1992-2022 Free Software Foundation, Inc. | 
 |  | 
 |    This file is part of GNU Binutils. | 
 |  | 
 |    This program is free software; you can redistribute it and/or modify | 
 |    it under the terms of the GNU General Public License as published by | 
 |    the Free Software Foundation; either version 3 of the License, or | 
 |    (at your option) any later version. | 
 |  | 
 |    This program is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |    GNU General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU General Public License | 
 |    along with this program; if not, write to the Free Software | 
 |    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
 |    MA 02110-1301, USA.  */ | 
 |  | 
 |  | 
 | /* Contributed by Steve Chamberlain | 
 |    		  sac@cygnus.com | 
 |  | 
 | */ | 
 | #define DONTDECLARE_MALLOC | 
 | #include "sysdep.h" | 
 | #include "bfd.h" | 
 | #include "arsup.h" | 
 | extern int verbose; | 
 | extern int yylex (void); | 
 | static void yyerror (const char *); | 
 | %} | 
 |  | 
 | %union { | 
 |   char *name; | 
 | struct list *list ; | 
 |  | 
 | }; | 
 |  | 
 | %token NEWLINE | 
 | %token VERBOSE | 
 | %token <name> FILENAME | 
 | %token ADDLIB | 
 | %token LIST | 
 | %token ADDMOD | 
 | %token CLEAR | 
 | %token CREATE | 
 | %token DELETE | 
 | %token DIRECTORY | 
 | %token END | 
 | %token EXTRACT | 
 | %token FULLDIR | 
 | %token HELP | 
 | %token QUIT | 
 | %token REPLACE | 
 | %token SAVE | 
 | %token OPEN | 
 |  | 
 | %type <list> modulelist | 
 | %type <list> modulename | 
 | %type <name> optional_filename | 
 | %% | 
 |  | 
 | start: | 
 | 	{ prompt(); } session | 
 | 	; | 
 |  | 
 | session: | 
 | 	    session command_line | 
 | 	| | 
 | 	; | 
 |  | 
 | command_line: | 
 | 		command NEWLINE { prompt(); } | 
 | 	; | 
 |  | 
 | command: | 
 | 		open_command | 
 | 	|	create_command | 
 | 	| 	verbose_command | 
 | 	|	directory_command | 
 | 	|	addlib_command | 
 | 	|	clear_command | 
 | 	|	addmod_command | 
 | 	| 	save_command | 
 |         |       extract_command | 
 | 	|	replace_command | 
 | 	|	delete_command | 
 | 	|	list_command | 
 | 	| 	END	 { ar_end(); return 0; } | 
 | 	| 	error | 
 | 	|       FILENAME { yyerror("foo"); } | 
 | 	| | 
 | 	; | 
 |  | 
 |  | 
 | extract_command: | 
 |                 EXTRACT modulename | 
 | 		{ ar_extract($2); } | 
 | 	; | 
 |  | 
 | replace_command: | 
 | 		REPLACE modulename | 
 | 		{ ar_replace($2); } | 
 | 	; | 
 |  | 
 | clear_command: | 
 | 		CLEAR | 
 | 		{ ar_clear(); } | 
 | 	; | 
 |  | 
 | delete_command: | 
 | 		DELETE modulename | 
 | 		{ ar_delete($2); } | 
 | 	; | 
 | addmod_command: | 
 | 	ADDMOD modulename | 
 | 		{ ar_addmod($2); } | 
 | 	; | 
 |  | 
 | list_command: | 
 | 		LIST | 
 | 		{ ar_list(); } | 
 | 	; | 
 |  | 
 | save_command: | 
 | 		SAVE | 
 | 		{ ar_save(); } | 
 | 	; | 
 |  | 
 |  | 
 |  | 
 | open_command: | 
 | 		OPEN FILENAME | 
 | 		{ ar_open($2,0); } | 
 | 	; | 
 |  | 
 | create_command: | 
 | 		CREATE FILENAME | 
 | 		{ ar_open($2,1); } | 
 | 	; | 
 |  | 
 |  | 
 | addlib_command: | 
 | 		ADDLIB FILENAME modulelist | 
 | 		{ ar_addlib($2,$3); } | 
 | 	; | 
 | directory_command: | 
 | 		DIRECTORY FILENAME modulelist optional_filename | 
 | 		{ ar_directory($2, $3, $4); } | 
 | 	; | 
 |  | 
 |  | 
 |  | 
 | optional_filename: | 
 | 		FILENAME | 
 | 		{ $$ = $1; } | 
 | 	|	{ $$ = 0; } | 
 | 	; | 
 |  | 
 | modulelist: | 
 | 	'(' modulename ')' | 
 | 		{ $$ = $2; } | 
 | 	| | 
 | 		{ $$ = 0; } | 
 | 	; | 
 |  | 
 | modulename: | 
 | 		modulename optcomma FILENAME | 
 | 		{ 	struct list *n  = (struct list *) malloc(sizeof(struct list)); | 
 | 			n->next = $1; | 
 | 			n->name = $3; | 
 | 			$$ = n; | 
 | 		 } | 
 | 	|	{ $$ = 0; } | 
 | 	; | 
 |  | 
 |  | 
 | optcomma: | 
 | 		',' | 
 | 	| | 
 | 	; | 
 |  | 
 |  | 
 | verbose_command: | 
 | 	VERBOSE | 
 | 		{ verbose = !verbose; } | 
 | 	; | 
 |  | 
 |  | 
 | %% | 
 |  | 
 | static void | 
 | yyerror (const char *x ATTRIBUTE_UNUSED) | 
 | { | 
 |   extern int linenumber; | 
 |  | 
 |   printf (_("Syntax error in archive script, line %d\n"), linenumber + 1); | 
 | } |