1 %{ /* defparse.y - parser for .def files */
2 
3 /*  Copyright 1995, 1997, 1998, 1999, 2001, 2004
4     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 2 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, MA 02110-1301, USA.  */
21 
22 #include "bfd.h"
23 #include "bucomm.h"
24 #include "dlltool.h"
25 %}
26 
27 %union {
28   char *id;
29   int number;
30 };
31 
32 %token NAME LIBRARY DESCRIPTION STACKSIZE HEAPSIZE CODE DATA
33 %token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANT
34 %token READ WRITE EXECUTE SHARED NONSHARED NONAME PRIVATE
35 %token SINGLE MULTIPLE INITINSTANCE INITGLOBAL TERMINSTANCE TERMGLOBAL
36 %token <id> ID
37 %token <number> NUMBER
38 %type  <number> opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE
39 %type  <number> attr attr_list opt_number
40 %type  <id> opt_name opt_equal_name
41 
42 %%
43 
44 start: start command
45 	| command
46 	;
47 
48 command:
49 		NAME opt_name opt_base { def_name ($2, $3); }
50 	|	LIBRARY opt_name opt_base option_list { def_library ($2, $3); }
51 	|	EXPORTS explist
52 	|	DESCRIPTION ID { def_description ($2);}
53 	|	STACKSIZE NUMBER opt_number { def_stacksize ($2, $3);}
54 	|	HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);}
55 	|	CODE attr_list { def_code ($2);}
56 	|	DATA attr_list  { def_data ($2);}
57 	|	SECTIONS seclist
58 	|	IMPORTS implist
59 	|	VERSIONK NUMBER { def_version ($2,0);}
60 	|	VERSIONK NUMBER '.' NUMBER { def_version ($2,$4);}
61 	;
62 
63 
64 explist:
65 		/* EMPTY */
66 	|	explist expline
67 	;
68 
69 expline:
70 		ID opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE
71 			{ def_exports ($1, $2, $3, $4, $5, $6, $7);}
72 	;
73 implist:
74 		implist impline
75 	|	impline
76 	;
77 
78 impline:
79                ID '=' ID '.' ID '.' ID     { def_import ($1,$3,$5,$7, 0); }
80        |       ID '=' ID '.' ID '.' NUMBER { def_import ($1,$3,$5, 0,$7); }
81        |       ID '=' ID '.' ID            { def_import ($1,$3, 0,$5, 0); }
82        |       ID '=' ID '.' NUMBER        { def_import ($1,$3, 0, 0,$5); }
83        |       ID '.' ID '.' ID            { def_import ( 0,$1,$3,$5, 0); }
84        |       ID '.' ID '.' NUMBER        { def_import ( 0,$1,$3, 0,$5); }
85        |       ID '.' ID                   { def_import ( 0,$1, 0,$3, 0); }
86        |       ID '.' NUMBER               { def_import ( 0,$1, 0, 0,$3); }
87 ;
88 
89 seclist:
90 		seclist secline
91 	|	secline
92 	;
93 
94 secline:
95 	ID attr_list { def_section ($1,$2);}
96 	;
97 
98 attr_list:
99 	attr_list opt_comma attr
100 	| attr
101 	;
102 
103 opt_comma:
104 	','
105 	|
106 	;
107 opt_number: ',' NUMBER { $$=$2;}
108 	|	   { $$=-1;}
109 	;
110 
111 attr:
112 		READ { $$ = 1; }
113 	|	WRITE { $$ = 2; }
114 	|	EXECUTE { $$ = 4; }
115 	|	SHARED { $$ = 8; }
116 	|	NONSHARED { $$ = 0; }
117 	|	SINGLE { $$ = 0; }
118 	|	MULTIPLE { $$ = 0; }
119 	;
120 
121 opt_CONSTANT:
122 		CONSTANT {$$=1;}
123 	|		 {$$=0;}
124 	;
125 
126 opt_NONAME:
127 		NONAME {$$=1;}
128 	|		 {$$=0;}
129 	;
130 
131 opt_DATA:
132 		DATA { $$ = 1; }
133 	|	     { $$ = 0; }
134 	;
135 
136 opt_PRIVATE:
137 		PRIVATE { $$ = 1; }
138 	|		{ $$ = 0; }
139 	;
140 
141 opt_name: ID		{ $$ =$1; }
142 	| ID '.' ID
143 	  {
144 	    char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1);
145 	    sprintf (name, "%s.%s", $1, $3);
146 	    $$ = name;
147 	  }
148 	|		{ $$=""; }
149 	;
150 
151 opt_ordinal:
152 	  '@' NUMBER     { $$=$2;}
153 	|                { $$=-1;}
154 	;
155 
156 opt_equal_name:
157           '=' ID	{ $$ = $2; }
158 	| '=' ID '.' ID
159 	  {
160 	    char *name = xmalloc (strlen ($2) + 1 + strlen ($4) + 1);
161 	    sprintf (name, "%s.%s", $2, $4);
162 	    $$ = name;
163 	  }
164         | 		{ $$ =  0; }
165 	;
166 
167 opt_base: BASE	'=' NUMBER	{ $$= $3;}
168 	|	{ $$=-1;}
169 	;
170 
171 option_list:
172 		/* empty */
173 	|	option_list opt_comma option
174 	;
175 
176 option:
177 		INITINSTANCE
178 	|	INITGLOBAL
179 	|	TERMINSTANCE
180 	|	TERMGLOBAL
181 	;
182