|  | %{ | 
|  | /* 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); | 
|  | } |