Changes in src/main.cc [0da3e2c:7880579]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/main.cc
r0da3e2c r7880579 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Aug 16 17:47:52201613 // Update Count : 2 5212 // Last Modified On : Mon Aug 15 17:58:57 2016 13 // Update Count : 220 14 14 // 15 15 … … 17 17 #include <fstream> 18 18 #include <getopt.h> 19 #include "Parser/lex.h" 20 #include "Parser/parser.h" 21 #include "Parser/TypedefTable.h" 19 #include "Parser/Parser.h" 22 20 #include "SynTree/Declaration.h" 23 21 #include "SynTree/Visitor.h" … … 49 47 using namespace std; 50 48 51 #define OPTPRINT(x) if ( errorp ) std::cerr << x << std::endl; 52 53 extern int yydebug; 54 55 LinkageSpec::Type linkage = LinkageSpec::Cforall; 56 TypedefTable typedefTable; 57 DeclarationNode *parseTree = nullptr; // program parse tree 49 #define OPTPRINT(x) \ 50 if ( errorp ) std::cerr << x << std::endl; 51 52 static void parse( FILE * input, LinkageSpec::Type t, bool shouldExit = false ); 53 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out = std::cout ); 58 54 59 55 bool … … 76 72 codegenp = false; 77 73 78 static void parse( FILE * input, LinkageSpec::Type t, bool shouldExit = false ); 79 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out = std::cout ); 80 static void parse_cmdline( int argc, char *argv[], const char *&filename ); 81 74 enum { Ast, Bbox, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 75 76 static struct option long_opts[] = { 77 { "ast", no_argument, 0, Ast }, 78 { "before-box", no_argument, 0, Bbox }, 79 { "before-resolver", no_argument, 0, Bresolver }, 80 { "ctorinitfix", no_argument, 0, CtorInitFix }, 81 { "expr", no_argument, 0, Expr }, 82 { "expralt", no_argument, 0, ExprAlt }, 83 { "grammar", no_argument, 0, Grammar }, 84 { "libcfa", no_argument, 0, LibCFA }, 85 { "no-preamble", no_argument, 0, Nopreamble }, 86 { "parse", no_argument, 0, Parse }, 87 { "no-prototypes", no_argument, 0, Prototypes }, 88 { "resolver", no_argument, 0, Resolver }, 89 { "symbol", no_argument, 0, Symbol }, 90 { "tree", no_argument, 0, Tree }, 91 { "validate", no_argument, 0, Validate }, 92 { 0, 0, 0, 0 } 93 }; 82 94 83 95 int main( int argc, char *argv[] ) { 84 96 FILE *input; 85 97 std::ostream *output = &std::cout; 98 int long_index; 86 99 std::list< Declaration * > translationUnit; 87 100 const char *filename = NULL; 88 101 89 parse_cmdline( argc, argv, filename ); // process command-line arguments 102 opterr = 0; // prevent getopt from printing error messages 103 104 int c; 105 while ( (c = getopt_long( argc, argv, "abBcefglnpqrstvyzD:F:", long_opts, &long_index )) != -1 ) { 106 switch ( c ) { 107 case Ast: 108 case 'a': // dump AST 109 astp = true; 110 break; 111 case Bresolver: 112 case 'b': // print before resolver steps 113 bresolvep = true; 114 break; 115 case 'B': // print before resolver steps 116 bboxp = true; 117 break; 118 case CtorInitFix: 119 case 'c': 120 ctorinitp = true; 121 break; 122 case Expr: 123 case 'e': // dump AST after expression analysis 124 exprp = true; 125 break; 126 case ExprAlt: 127 case 'f': // print alternatives for expressions 128 expraltp = true; 129 break; 130 case Grammar: 131 case 'g': // bison debugging info (grammar rules) 132 grammarp = true; 133 break; 134 case LibCFA: 135 case 'l': // generate libcfa.c 136 libcfap = true; 137 break; 138 case Nopreamble: 139 case 'n': // do not read preamble 140 nopreludep = true; 141 break; 142 case Prototypes: 143 case 'p': // generate prototypes for preamble functions 144 noprotop = true; 145 break; 146 case Parse: 147 case 'q': // dump parse tree 148 parsep = true; 149 break; 150 case Resolver: 151 case 'r': // print resolver steps 152 resolvep = true; 153 break; 154 case Symbol: 155 case 's': // print symbol table events 156 symtabp = true; 157 break; 158 case Tree: 159 case 't': // build in tree 160 treep = true; 161 break; 162 case 'v': // dump AST after decl validation pass 163 validp = true; 164 break; 165 case 'y': 166 errorp = true; 167 break; 168 case 'z': 169 codegenp = true; 170 break; 171 case 'D': // ignore -Dxxx 172 break; 173 case 'F': // source file-name without suffix 174 filename = optarg; 175 break; 176 case '?': 177 cout << "Unknown option: '" << (char)optopt << "'" << endl; 178 exit( EXIT_FAILURE ); 179 default: 180 abort(); 181 } // switch 182 } // while 90 183 91 184 try { … … 113 206 } // if 114 207 115 yydebug = grammarp;208 Parser::get_parser().set_debug( grammarp ); 116 209 117 210 // read in the builtins, extras, and the prelude … … 148 241 149 242 if ( parsep ) { 150 parseTree->printList( std::cout );151 delete parseTree;152 return 0; 153 } // if 154 155 buildList( parseTree, translationUnit );156 delete parseTree; 157 243 Parser::get_parser().get_parseTree()->printList( std::cout ); 244 Parser::get_parser().freeTree(); 245 return 0; 246 } // if 247 248 buildList( Parser::get_parser().get_parseTree(), translationUnit ); 249 250 Parser::get_parser().freeTree(); 158 251 if ( astp ) { 159 252 dump( translationUnit ); … … 268 361 } // main 269 362 270 void parse_cmdline( int argc, char *argv[], const char *&filename ) { 271 enum { Ast, Bbox, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 272 273 static struct option long_opts[] = { 274 { "ast", no_argument, 0, Ast }, 275 { "before-box", no_argument, 0, Bbox }, 276 { "before-resolver", no_argument, 0, Bresolver }, 277 { "ctorinitfix", no_argument, 0, CtorInitFix }, 278 { "expr", no_argument, 0, Expr }, 279 { "expralt", no_argument, 0, ExprAlt }, 280 { "grammar", no_argument, 0, Grammar }, 281 { "libcfa", no_argument, 0, LibCFA }, 282 { "no-preamble", no_argument, 0, Nopreamble }, 283 { "parse", no_argument, 0, Parse }, 284 { "no-prototypes", no_argument, 0, Prototypes }, 285 { "resolver", no_argument, 0, Resolver }, 286 { "symbol", no_argument, 0, Symbol }, 287 { "tree", no_argument, 0, Tree }, 288 { "validate", no_argument, 0, Validate }, 289 { 0, 0, 0, 0 } 290 }; // long_opts 291 int long_index; 292 293 opterr = 0; // (global) prevent getopt from printing error messages 294 295 int c; 296 while ( (c = getopt_long( argc, argv, "abBcefglnpqrstvyzD:F:", long_opts, &long_index )) != -1 ) { 297 switch ( c ) { 298 case Ast: 299 case 'a': // dump AST 300 astp = true; 301 break; 302 case Bresolver: 303 case 'b': // print before resolver steps 304 bresolvep = true; 305 break; 306 case 'B': // print before resolver steps 307 bboxp = true; 308 break; 309 case CtorInitFix: 310 case 'c': 311 ctorinitp = true; 312 break; 313 case Expr: 314 case 'e': // dump AST after expression analysis 315 exprp = true; 316 break; 317 case ExprAlt: 318 case 'f': // print alternatives for expressions 319 expraltp = true; 320 break; 321 case Grammar: 322 case 'g': // bison debugging info (grammar rules) 323 grammarp = true; 324 break; 325 case LibCFA: 326 case 'l': // generate libcfa.c 327 libcfap = true; 328 break; 329 case Nopreamble: 330 case 'n': // do not read preamble 331 nopreludep = true; 332 break; 333 case Prototypes: 334 case 'p': // generate prototypes for preamble functions 335 noprotop = true; 336 break; 337 case Parse: 338 case 'q': // dump parse tree 339 parsep = true; 340 break; 341 case Resolver: 342 case 'r': // print resolver steps 343 resolvep = true; 344 break; 345 case Symbol: 346 case 's': // print symbol table events 347 symtabp = true; 348 break; 349 case Tree: 350 case 't': // build in tree 351 treep = true; 352 break; 353 case 'v': // dump AST after decl validation pass 354 validp = true; 355 break; 356 case 'y': 357 errorp = true; 358 break; 359 case 'z': 360 codegenp = true; 361 break; 362 case 'D': // ignore -Dxxx 363 break; 364 case 'F': // source file-name without suffix 365 filename = optarg; 366 break; 367 case '?': 368 cout << "Unknown option: '" << (char)optopt << "'" << endl; 369 exit( EXIT_FAILURE ); 370 default: 371 abort(); 372 } // switch 373 } // while 374 } // parse_cmdline 375 376 static void parse( FILE * input, LinkageSpec::Type link, bool shouldExit ) { 377 extern int yyparse( void ); 378 extern FILE *yyin; 379 extern int yylineno; 380 381 linkage = link; // set globals 382 yyin = input; 383 yylineno = 1; 384 typedefTable.enterScope(); 385 int parseStatus = yyparse(); 363 static void parse( FILE * input, LinkageSpec::Type linkage, bool shouldExit ) { 364 Parser::get_parser().set_linkage( linkage ); 365 Parser::get_parser().parse( input ); 386 366 387 367 fclose( input ); 388 if ( shouldExit || parseStatus!= 0 ) {389 exit( parseStatus);368 if ( shouldExit || Parser::get_parser().get_parseStatus() != 0 ) { 369 exit( Parser::get_parser().get_parseStatus() ); 390 370 } // if 391 } // parse371 } 392 372 393 373 static bool notPrelude( Declaration * decl ) { 394 374 return ! LinkageSpec::isBuiltin( decl->get_linkage() ); 395 } // notPrelude375 } 396 376 397 377 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out ) { … … 405 385 printAll( decls, out ); 406 386 deleteAll( translationUnit ); 407 } // dump 387 } 388 408 389 409 390 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.