static const char *NAME = "parse_zeno"; //===========================// //== This software is ==// //== (c)opyrighted in 1993 ==// //== by Chris Koeritz ==// //== cak0l@Virginia.EDU ==// //===========================// #include "to_ada.h" #include "guards.h" #include "basics.h" #include "help_yacc.h" #include "comline.h" #include "symbol_tree.h" #include #include to_ada *prs; void get_parameters_and_set_status (int argc, char *argv[], int &parser_only, packable_amorph &file_names); main(int argc, char *argv[]) { symbol_tree *accumulated_operations = new symbol_tree; packable_amorph fileamo(0); int parser_only = FALSE; get_parameters_and_set_status(argc, argv, parser_only, fileamo); while (fileamo.elements() > 0) { string filename((char *)fileamo.get(0)->held()); prs = new to_ada(filename, accumulated_operations); if (parser_only) prs->set_parser_only(); yyparse(); delete prs; fileamo.zap(0, 0); } // need to save the symbol tree. exit(0); } void yyerror(char *error_mess) { string message("%s at line %d, character %d, last token %d, matched \"%s\"", error_mess, yylineno, yycurrent_position+1, last_token, yytext); deadly_error(NAME, "yyerror", message); } int yywrap() { return TRUE; } void print_instructions_and_exit(char *program_name) { cout << program_name << ": This program is the ZENO pre-processor for Ada.\n\ \nOverall format:\n\n\t" << program_name << " [ -p ] [ ] ....\n\n\ At least one file name must be specified. Multiple file names may be\n\ specified. If the \"-p\" option is given, the program acts as a pre-processor\n\ only--a formatted Ada program will be output. The files that are created\n\ end with the letters \".a\". This indicates that the program constructed is\n\ pure Ada. Input files may have any suffix except \".a\".\n" << flush; exit(1); } #define PARSER_ONLY 0 #define NUMBER_OF_PARMS 1 void get_parameters_and_set_status (int argc, char *argv[], int &parser_only, packable_amorph &file_names) { switch_block params[NUMBER_OF_PARMS]; params[PARSER_ONLY].option_character = 'p'; params[PARSER_ONLY].eats_a_parameter = FALSE; string program_name(argv[0]); int ret = command_line_parse(argc, argv, NUMBER_OF_PARMS, params); if (params[PARSER_ONLY].found_on_line) parser_only = TRUE; argv += ret; argc -= ret; if (argc <= 1) print_instructions_and_exit(program_name); while (argc > 1) { string filename(*++argv); file_names.adjust(file_names.elements() + 1); chunk *to_stuff = new chunk (SELF_OWNED, (byte *)(char *)filename, filename.length() + 1); file_names.put(file_names.elements() - 1, to_stuff); argc--; } } void parse_error (const char *file_name, char *function_name, char *zeno_name, char *message, int line, int char_posn) { string full_message(zeno_name); full_message += "--"; full_message += message; full_message += string("\nat line %d, position %d.", line, char_posn); deadly_error(file_name, function_name, full_message); }