203 lines
3.1 KiB
Text
203 lines
3.1 KiB
Text
|
%{
|
||
|
/* 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);
|
||
|
}
|