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
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.
36 #include "coretypes.h"
43 #include "diagnostic.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. */
64 /* Global variables. */
66 extern struct cbl_tree_struct_parse_tree_top
* parse_tree_top
;
72 /* Trace the parser. */
73 unsigned int option_parser_trace
= 0;
75 /* Trace the lexical analysis. */
77 unsigned int option_lexer_trace
= 0;
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. */
93 treelang_init_options (unsigned int argc ATTRIBUTE_UNUSED
,
94 const char **argv ATTRIBUTE_UNUSED
)
99 /* Process a switch - called by opts.c. */
101 treelang_handle_option (size_t scode
, const char *arg ATTRIBUTE_UNUSED
,
104 enum opt_code code
= (enum opt_code
) scode
;
114 fputs (language_string
, stdout
);
115 fputs (version_string
, stdout
);
116 fputs ("\n", stdout
);
122 option_lexer_trace
= 1;
123 option_parser_trace
= 1;
126 case OPT_fparser_trace
:
127 option_parser_trace
= value
;
130 case OPT_flexer_trace
:
131 option_lexer_trace
= value
;
138 /* Language dependent parser setup. */
143 input_filename
= main_input_filename
;
146 /* Init decls etc. */
148 treelang_init_decl_processing ();
150 /* This error will not happen from GCC as it will always create a
152 if (!input_filename
|| input_filename
[0] == ' ' || !input_filename
[0])
156 fprintf (stderr
, "No input file specified, try --help for help\n");
163 yyin
= fopen (input_filename
, "r");
166 fprintf (stderr
, "Unable to open input file %s\n", input_filename
);
173 /* Language dependent wrapup. */
176 treelang_finish (void)
181 /* Parse a file. Debug flag doesn't seem to work. */
184 treelang_parse_file (int debug_flag ATTRIBUTE_UNUSED
)
190 /* Allocate SIZE bytes and clear them. Not to be used for strings
191 which must go in stringpool. */
194 my_malloc (size_t size
)
197 mem
= ggc_alloc (size
);
200 fprintf (stderr
, "\nOut of memory\n");
203 memset (mem
, 0, size
);
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,
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
;
220 tok
= SYMBOL_TABLE_NAME (prod
);
223 for (this = symbol_table
; this; this = this->tp
.pro
.next
)
226 this_tok
= this->tp
.pro
.main_token
;
227 sanity_check (this_tok
);
228 if (tok
->tp
.tok
.length
!= this_tok
->tp
.tok
.length
)
230 if (memcmp (tok
->tp
.tok
.chars
, this_tok
->tp
.tok
.chars
, this_tok
->tp
.tok
.length
))
232 if (option_parser_trace
)
233 fprintf (stderr
, "Found symbol %s (%i:%i) as %i \n",
235 tok
->tp
.tok
.location
.line
, tok
->tp
.tok
.charno
,
236 NUMERIC_TYPE (this));
239 if (option_parser_trace
)
240 fprintf (stderr
, "Not found symbol %s (%i:%i) as %i \n",
242 tok
->tp
.tok
.location
.line
, tok
->tp
.tok
.charno
, tok
->type
);
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
);
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
);
262 prod
->tp
.pro
.next
= symbol_table
;
263 NESTING_LEVEL (prod
) = work_nesting_level
;
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
;
277 prod
->tp
.pro
.main_token
= main_tok
;
281 /* Abort if ITEM is not a valid structure, based on 'category'. */
284 sanity_check (struct prod_token_parm_item
*item
)
286 switch (item
->category
)
289 case production_category
:
290 case parameter_category
:
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"