%{ /* arparse.y - Stange script language parser */ /* Copyright (C) 1992 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Contributed by Steve Chamberlain sac@cygnus.com */ #define DONTDECLARE_MALLOC #include "bfd.h" #include <sysdep.h> #include "arsup.h" extern int interactive; extern bfd *inarch; extern int verbose; void (*command)(); FILE *listing; %} %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 | replace_command | delete_command | list_command | END { return 0; } | error | ; 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; } ; %% int yyerror(x) char *x; { extern int linenumber; printf("Synax error in archive script, line %d\n", linenumber + 1); return 0; }