* doc/c-tree.texi (Function Bodies): Update HANDLER documentation.
[official-gcc.git] / gcc / treelang / tree1.c
blob3ee7c161944ebcf29d24ccff940c8dd9bfcc857a
1 /*
3 TREELANG Compiler almost main (tree1)
4 Called by GCC's toplev.c
6 Copyright (C) 1986, 87, 89, 92-96, 1997, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
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.
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, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
23 In other words, you are welcome to use, share and improve this program.
24 You are forbidden to forbid anyone else to use, share and improve
25 what you give them. Help stamp out software-hoarding!
27 ---------------------------------------------------------------------------
29 Written by Tim Josling 1999, 2000, 2001, based in part on other
30 parts of the GCC compiler.
34 #include "config.h"
35 #include "system.h"
36 #include "coretypes.h"
37 #include "tm.h"
38 #include "flags.h"
39 #include "toplev.h"
41 #include "ggc.h"
42 #include "tree.h"
43 #include "diagnostic.h"
45 #include "treelang.h"
46 #include "treetree.h"
47 #include "opts.h"
48 #include "options.h"
50 extern int yyparse (void);
52 /* Linked list of symbols - all must be unique in treelang. */
54 static GTY(()) struct prod_token_parm_item *symbol_table = NULL;
56 /* Language for usage for messages. */
58 const char *const language_string = "TREELANG - sample front end for GCC ";
60 /* Local prototypes. */
62 void version (void);
64 /* Global variables. */
66 extern struct cbl_tree_struct_parse_tree_top* parse_tree_top;
68 /*
69 Options.
72 /* Trace the parser. */
73 unsigned int option_parser_trace = 0;
75 /* Trace the lexical analysis. */
77 unsigned int option_lexer_trace = 0;
79 /* Warning levels. */
81 /* Local variables. */
83 /* This is 1 if we have output the version string. */
85 static int version_done = 0;
87 /* Variable nesting level. */
89 static unsigned int work_nesting_level = 0;
91 /* Prepare to handle switches. */
92 unsigned int
93 treelang_init_options (unsigned int argc ATTRIBUTE_UNUSED,
94 const char **argv ATTRIBUTE_UNUSED)
96 return CL_Treelang;
99 /* Process a switch - called by opts.c. */
101 treelang_handle_option (size_t scode, const char *arg ATTRIBUTE_UNUSED,
102 int value)
104 enum opt_code code = (enum opt_code) scode;
106 switch (code)
108 default:
109 abort();
111 case OPT_v:
112 if (!version_done)
114 fputs (language_string, stdout);
115 fputs (version_string, stdout);
116 fputs ("\n", stdout);
117 version_done = 1;
119 break;
121 case OPT_y:
122 option_lexer_trace = 1;
123 option_parser_trace = 1;
124 break;
126 case OPT_fparser_trace:
127 option_parser_trace = value;
128 break;
130 case OPT_flexer_trace:
131 option_lexer_trace = value;
132 break;
135 return 1;
138 /* Language dependent parser setup. */
140 bool
141 treelang_init (void)
143 input_filename = main_input_filename;
144 input_line = 0;
146 /* Init decls etc. */
148 treelang_init_decl_processing ();
150 /* This error will not happen from GCC as it will always create a
151 fake input file. */
152 if (!input_filename || input_filename[0] == ' ' || !input_filename[0])
154 if (!version_done)
156 fprintf (stderr, "No input file specified, try --help for help\n");
157 exit (1);
160 return false;
163 yyin = fopen (input_filename, "r");
164 if (!yyin)
166 fprintf (stderr, "Unable to open input file %s\n", input_filename);
167 exit (1);
170 return true;
173 /* Language dependent wrapup. */
175 void
176 treelang_finish (void)
178 fclose (yyin);
181 /* Parse a file. Debug flag doesn't seem to work. */
183 void
184 treelang_parse_file (int debug_flag ATTRIBUTE_UNUSED)
186 treelang_debug ();
187 yyparse ();
190 /* Allocate SIZE bytes and clear them. Not to be used for strings
191 which must go in stringpool. */
193 void *
194 my_malloc (size_t size)
196 void *mem;
197 mem = ggc_alloc (size);
198 if (!mem)
200 fprintf (stderr, "\nOut of memory\n");
201 abort ();
203 memset (mem, 0, size);
204 return mem;
207 /* Look up a name in PROD->SYMBOL_TABLE_NAME in the symbol table;
208 return the symbol table entry from the symbol table if found there,
209 else 0. */
211 struct prod_token_parm_item*
212 lookup_tree_name (struct prod_token_parm_item *prod)
214 struct prod_token_parm_item *this;
215 struct prod_token_parm_item *this_tok;
216 struct prod_token_parm_item *tok;
218 sanity_check (prod);
220 tok = SYMBOL_TABLE_NAME (prod);
221 sanity_check (tok);
223 for (this = symbol_table; this; this = this->tp.pro.next)
225 sanity_check (this);
226 this_tok = this->tp.pro.main_token;
227 sanity_check (this_tok);
228 if (tok->tp.tok.length != this_tok->tp.tok.length)
229 continue;
230 if (memcmp (tok->tp.tok.chars, this_tok->tp.tok.chars, this_tok->tp.tok.length))
231 continue;
232 if (option_parser_trace)
233 fprintf (stderr, "Found symbol %s (%i:%i) as %i \n",
234 tok->tp.tok.chars,
235 tok->tp.tok.location.line, tok->tp.tok.charno,
236 NUMERIC_TYPE (this));
237 return this;
239 if (option_parser_trace)
240 fprintf (stderr, "Not found symbol %s (%i:%i) as %i \n",
241 tok->tp.tok.chars,
242 tok->tp.tok.location.line, tok->tp.tok.charno, tok->type);
243 return NULL;
246 /* Insert name PROD into the symbol table. Return 1 if duplicate, 0 if OK. */
249 insert_tree_name (struct prod_token_parm_item *prod)
251 struct prod_token_parm_item *tok;
252 tok = SYMBOL_TABLE_NAME (prod);
253 sanity_check (prod);
254 if (lookup_tree_name (prod))
256 fprintf (stderr, "%s:%i:%i duplicate name %s\n",
257 tok->tp.tok.location.file, tok->tp.tok.location.line,
258 tok->tp.tok.charno, tok->tp.tok.chars);
259 errorcount++;
260 return 1;
262 prod->tp.pro.next = symbol_table;
263 NESTING_LEVEL (prod) = work_nesting_level;
264 symbol_table = prod;
265 return 0;
268 /* Create a struct productions of type TYPE, main token MAIN_TOK. */
270 struct prod_token_parm_item *
271 make_production (int type, struct prod_token_parm_item *main_tok)
273 struct prod_token_parm_item *prod;
274 prod = my_malloc (sizeof (struct prod_token_parm_item));
275 prod->category = production_category;
276 prod->type = type;
277 prod->tp.pro.main_token = main_tok;
278 return prod;
281 /* Abort if ITEM is not a valid structure, based on 'category'. */
283 void
284 sanity_check (struct prod_token_parm_item *item)
286 switch (item->category)
288 case token_category:
289 case production_category:
290 case parameter_category:
291 break;
293 default:
294 abort ();
298 /* New garbage collection regime see gty.texi. */
299 #include "gt-treelang-tree1.h"
300 /*#include "gt-treelang-treelang.h"*/
301 #include "gtype-treelang.h"