| %{ | |
| /* arparse.y - Strange script language parser */ | |
| /* Copyright (C) 1992-2025 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); | |
| } |