Home | History | Annotate | Download | only in binutils
      1 %{
      2 /* arparse.y - Stange script language parser */
      3 
      4 /* Copyright (C) 1992-2014 Free Software Foundation, Inc.
      5 
      6    This file is part of GNU Binutils.
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 
     24 /* Contributed by Steve Chamberlain
     25    		  sac (at) cygnus.com
     26 
     27 */
     28 #define DONTDECLARE_MALLOC
     29 #include "sysdep.h"
     30 #include "bfd.h"
     31 #include "arsup.h"
     32 extern int verbose;
     33 extern int yylex (void);
     34 static int yyerror (const char *);
     35 %}
     36 
     37 %union {
     38   char *name;
     39 struct list *list ;
     40 
     41 };
     42 
     43 %token NEWLINE
     44 %token VERBOSE
     45 %token <name> FILENAME
     46 %token ADDLIB
     47 %token LIST
     48 %token ADDMOD
     49 %token CLEAR
     50 %token CREATE
     51 %token DELETE
     52 %token DIRECTORY
     53 %token END
     54 %token EXTRACT
     55 %token FULLDIR
     56 %token HELP
     57 %token QUIT
     58 %token REPLACE
     59 %token SAVE
     60 %token OPEN
     61 
     62 %type <list> modulelist
     63 %type <list> modulename
     64 %type <name> optional_filename
     65 %%
     66 
     67 start:
     68 	{ prompt(); } session
     69 	;
     70 
     71 session:
     72 	    session command_line
     73 	|
     74 	;
     75 
     76 command_line:
     77 		command NEWLINE { prompt(); }
     78 	;
     79 
     80 command:
     81 		open_command
     82 	|	create_command
     83 	| 	verbose_command
     84 	|	directory_command
     85 	|	addlib_command
     86 	|	clear_command
     87 	|	addmod_command
     88 	| 	save_command
     89         |       extract_command
     90 	|	replace_command
     91 	|	delete_command
     92 	|	list_command
     93 	| 	END	 { ar_end(); return 0; }
     94 	| 	error
     95 	|       FILENAME { yyerror("foo"); }
     96 	|
     97 	;
     98 
     99 
    100 extract_command:
    101                 EXTRACT modulename
    102 		{ ar_extract($2); }
    103 	;
    104 
    105 replace_command:
    106 		REPLACE modulename
    107 		{ ar_replace($2); }
    108 	;
    109 
    110 clear_command:
    111 		CLEAR
    112 		{ ar_clear(); }
    113 	;
    114 
    115 delete_command:
    116 		DELETE modulename
    117 		{ ar_delete($2); }
    118 	;
    119 addmod_command:
    120 	ADDMOD modulename
    121 		{ ar_addmod($2); }
    122 	;
    123 
    124 list_command:
    125 		LIST
    126 		{ ar_list(); }
    127 	;
    128 
    129 save_command:
    130 		SAVE
    131 		{ ar_save(); }
    132 	;
    133 
    134 
    135 
    136 open_command:
    137 		OPEN FILENAME
    138 		{ ar_open($2,0); }
    139 	;
    140 
    141 create_command:
    142 		CREATE FILENAME
    143 		{ ar_open($2,1); }
    144 	;
    145 
    146 
    147 addlib_command:
    148 		ADDLIB FILENAME modulelist
    149 		{ ar_addlib($2,$3); }
    150 	;
    151 directory_command:
    152 		DIRECTORY FILENAME modulelist optional_filename
    153 		{ ar_directory($2, $3, $4); }
    154 	;
    155 
    156 
    157 
    158 optional_filename:
    159 		FILENAME
    160 		{ $$ = $1; }
    161 	|	{ $$ = 0; }
    162 	;
    163 
    164 modulelist:
    165 	'(' modulename ')'
    166 		{ $$ = $2; }
    167 	|
    168 		{ $$ = 0; }
    169 	;
    170 
    171 modulename:
    172 		modulename optcomma FILENAME
    173 		{ 	struct list *n  = (struct list *) malloc(sizeof(struct list));
    174 			n->next = $1;
    175 			n->name = $3;
    176 			$$ = n;
    177 		 }
    178 	|	{ $$ = 0; }
    179 	;
    180 
    181 
    182 optcomma:
    183 		','
    184 	|
    185 	;
    186 
    187 
    188 verbose_command:
    189 	VERBOSE
    190 		{ verbose = !verbose; }
    191 	;
    192 
    193 
    194 %%
    195 
    196 static int
    197 yyerror (const char *x ATTRIBUTE_UNUSED)
    198 {
    199   extern int linenumber;
    200 
    201   printf (_("Syntax error in archive script, line %d\n"), linenumber + 1);
    202   return 0;
    203 }
    204