Changes in src/main.cc [8b7ee09:35f9114]
- File:
-
- 1 edited
-
src/main.cc (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/main.cc
r8b7ee09 r35f9114 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 19 08:31:22201613 // Update Count : 35012 // Last Modified On : Sat Aug 6 16:17:41 2016 13 // Update Count : 210 14 14 // 15 15 16 16 #include <iostream> 17 17 #include <fstream> 18 #include <cstdlib> 19 #include <cstdio> 18 20 #include <getopt.h> 19 #include "Parser/lex.h" 20 #include "Parser/parser.h" 21 #include "Parser/TypedefTable.h" 21 #include "Parser/Parser.h" 22 #include "Parser/ParseNode.h" 23 #include "Parser/LinkageSpec.h" 24 #include "SynTree/Declaration.h" 25 #include "SynTree/Visitor.h" 22 26 #include "GenPoly/Lvalue.h" 23 27 #include "GenPoly/Specialize.h" … … 28 32 #include "CodeGen/FixNames.h" 29 33 #include "ControlStruct/Mutate.h" 34 #include "Tuples/Mutate.h" 35 #include "Tuples/FunctionChecker.h" 36 #include "SymTab/Mangler.h" 37 #include "SymTab/Indexer.h" 30 38 #include "SymTab/Validate.h" 31 39 #include "ResolvExpr/AlternativePrinter.h" 32 40 #include "ResolvExpr/Resolver.h" 33 41 #include "MakeLibCfa.h" 42 #include "InitTweak/Mutate.h" 34 43 #include "InitTweak/GenInit.h" 35 44 #include "InitTweak/FixInit.h" 45 //#include "Explain/GenProlog.h" 46 //#include "Try/Visit.h" 47 48 #include "Common/SemanticError.h" 36 49 #include "Common/UnimplementedError.h" 37 50 … … 40 53 using namespace std; 41 54 42 #define OPTPRINT(x) if ( errorp ) std::cerr << x << std::endl; 43 44 45 LinkageSpec::Spec linkage = LinkageSpec::Cforall; 46 TypedefTable typedefTable; 47 DeclarationNode * parseTree = nullptr; // program parse tree 48 49 extern int yydebug; // set for -g flag (Grammar) 55 #define OPTPRINT(x) \ 56 if ( errorp ) std::cerr << x << std::endl; 57 58 static void parse( FILE * input, LinkageSpec::Type t, bool shouldExit = false ); 59 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out = std::cout ); 60 50 61 bool 51 62 astp = false, … … 55 66 exprp = false, 56 67 expraltp = false, 68 grammarp = false, 57 69 libcfap = false, 58 70 nopreludep = false, … … 66 78 codegenp = false; 67 79 68 static void parse_cmdline( int argc, char *argv[], const char *& filename ); 69 static void parse( FILE * input, LinkageSpec::Spec linkage, bool shouldExit = false ); 70 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out = std::cout ); 71 72 int main( int argc, char * argv[] ) { 73 FILE * input; // use FILE rather than istream because yyin is FILE 74 std::ostream *output = & std::cout; 80 enum { Ast, Bbox, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 81 82 static struct option long_opts[] = { 83 { "ast", no_argument, 0, Ast }, 84 { "before-box", no_argument, 0, Bbox }, 85 { "before-resolver", no_argument, 0, Bresolver }, 86 { "ctorinitfix", no_argument, 0, CtorInitFix }, 87 { "expr", no_argument, 0, Expr }, 88 { "expralt", no_argument, 0, ExprAlt }, 89 { "grammar", no_argument, 0, Grammar }, 90 { "libcfa", no_argument, 0, LibCFA }, 91 { "no-preamble", no_argument, 0, Nopreamble }, 92 { "parse", no_argument, 0, Parse }, 93 { "no-prototypes", no_argument, 0, Prototypes }, 94 { "resolver", no_argument, 0, Resolver }, 95 { "symbol", no_argument, 0, Symbol }, 96 { "tree", no_argument, 0, Tree }, 97 { "validate", no_argument, 0, Validate }, 98 { 0, 0, 0, 0 } 99 }; 100 101 int main( int argc, char *argv[] ) { 102 FILE *input; 103 std::ostream *output = &std::cout; 104 int long_index; 75 105 std::list< Declaration * > translationUnit; 76 const char *filename = nullptr; 77 78 parse_cmdline( argc, argv, filename ); // process command-line arguments 106 const char *filename = NULL; 107 108 opterr = 0; // prevent getopt from printing error messages 109 110 int c; 111 while ( (c = getopt_long( argc, argv, "abBcefglnpqrstvyzD:F:", long_opts, &long_index )) != -1 ) { 112 switch ( c ) { 113 case Ast: 114 case 'a': // dump AST 115 astp = true; 116 break; 117 case Bresolver: 118 case 'b': // print before resolver steps 119 bresolvep = true; 120 break; 121 case 'B': // print before resolver steps 122 bboxp = true; 123 break; 124 case CtorInitFix: 125 case 'c': 126 ctorinitp = true; 127 break; 128 case Expr: 129 case 'e': // dump AST after expression analysis 130 exprp = true; 131 break; 132 case ExprAlt: 133 case 'f': // print alternatives for expressions 134 expraltp = true; 135 break; 136 case Grammar: 137 case 'g': // bison debugging info (grammar rules) 138 grammarp = true; 139 break; 140 case LibCFA: 141 case 'l': // generate libcfa.c 142 libcfap = true; 143 break; 144 case Nopreamble: 145 case 'n': // do not read preamble 146 nopreludep = true; 147 break; 148 case Prototypes: 149 case 'p': // generate prototypes for preamble functions 150 noprotop = true; 151 break; 152 case Parse: 153 case 'q': // dump parse tree 154 parsep = true; 155 break; 156 case Resolver: 157 case 'r': // print resolver steps 158 resolvep = true; 159 break; 160 case Symbol: 161 case 's': // print symbol table events 162 symtabp = true; 163 break; 164 case Tree: 165 case 't': // build in tree 166 treep = true; 167 break; 168 case 'v': // dump AST after decl validation pass 169 validp = true; 170 break; 171 case 'y': 172 errorp = true; 173 break; 174 case 'z': 175 codegenp = true; 176 break; 177 case 'D': // ignore -Dxxx 178 break; 179 case 'F': // source file-name without suffix 180 filename = optarg; 181 break; 182 case '?': 183 cout << "Unknown option: '" << (char)optopt << "'" << endl; 184 exit( EXIT_FAILURE ); 185 default: 186 abort(); 187 } // switch 188 } // while 79 189 80 190 try { 81 191 // choose to read the program from a file or stdin 82 if ( optind < argc ) { // any commands after the flags ? => input file name192 if ( optind < argc ) { 83 193 input = fopen( argv[ optind ], "r" ); 84 assertf( input, "cannot open %s\n", argv[ optind ] ); 194 if ( ! input ) { 195 std::cout << "Error: cannot open " << argv[ optind ] << std::endl; 196 exit( EXIT_FAILURE ); 197 } // if 85 198 // if running cfa-cpp directly, might forget to pass -F option (and really shouldn't have to) 86 if ( filename == nullptr) filename = argv[ optind ];199 if ( filename == NULL ) filename = argv[ optind ]; 87 200 // prelude filename comes in differently 88 201 if ( libcfap ) filename = "prelude.cf"; 89 202 optind += 1; 90 } else { // no input file name203 } else { 91 204 input = stdin; 92 205 // if running cfa-cpp directly, might forget to pass -F option. Since this takes from stdin, pass 93 206 // a fake name along 94 if ( filename == nullptr) filename = "stdin";95 } // if 96 97 if ( optind < argc ) { // any commands after the flags and input file ? => output file name207 if ( filename == NULL ) filename = "stdin"; 208 } // if 209 210 if ( optind < argc ) { 98 211 output = new ofstream( argv[ optind ] ); 99 212 } // if 213 214 Parser::get_parser().set_debug( grammarp ); 100 215 101 216 // read in the builtins, extras, and the prelude … … 103 218 // -l is for initial build ONLY and builtins.cf is not in the lib directory so access it here. 104 219 FILE * builtins = fopen( libcfap | treep ? "builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" ); 105 assertf( builtins, "cannot open builtins.cf\n" ); 220 if ( builtins == NULL ) { 221 std::cerr << "Error: cannot open builtins.cf" << std::endl; 222 exit( EXIT_FAILURE ); 223 } // if 106 224 parse( builtins, LinkageSpec::Compiler ); 107 225 108 226 // read the extra prelude in, if not generating the cfa library 109 227 FILE * extras = fopen( libcfap | treep ? "extras.cf" : CFA_LIBDIR "/extras.cf", "r" ); 110 assertf( extras, "cannot open extras.cf\n" ); 228 if ( extras == NULL ) { 229 std::cerr << "Error: cannot open extras.cf" << std::endl; 230 exit( EXIT_FAILURE ); 231 } // if 111 232 parse( extras, LinkageSpec::C ); 112 233 … … 114 235 // read the prelude in, if not generating the cfa library 115 236 FILE * prelude = fopen( treep ? "prelude.cf" : CFA_LIBDIR "/prelude.cf", "r" ); 116 assertf( prelude, "cannot open prelude.cf\n" ); 237 if ( prelude == NULL ) { 238 std::cerr << "Error: cannot open prelude.cf" << std::endl; 239 exit( EXIT_FAILURE ); 240 } // if 241 117 242 parse( prelude, LinkageSpec::Intrinsic ); 118 243 } // if 119 244 } // if 120 245 121 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, yydebug);246 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 122 247 123 248 if ( parsep ) { 124 parseTree->printList( std::cout ); 125 delete parseTree; 126 return 0; 127 } // if 128 129 buildList( parseTree, translationUnit ); 130 delete parseTree; 131 parseTree = nullptr; 132 249 Parser::get_parser().get_parseTree()->printList( std::cout ); 250 Parser::get_parser().freeTree(); 251 return 0; 252 } // if 253 254 buildList( Parser::get_parser().get_parseTree(), translationUnit ); 255 256 Parser::get_parser().freeTree(); 133 257 if ( astp ) { 134 258 dump( translationUnit ); … … 176 300 dump( translationUnit ); 177 301 return 0; 178 } // if302 } 179 303 180 304 // fix ObjectDecl - replaces ConstructorInit nodes … … 184 308 dump ( translationUnit ); 185 309 return 0; 186 } // if310 } 187 311 188 312 OPTPRINT("instantiateGenerics") … … 198 322 dump( translationUnit ); 199 323 return 0; 200 } // if324 } 201 325 OPTPRINT( "box" ) 202 326 GenPoly::box( translationUnit ); … … 218 342 dump( translationUnit, std::cerr ); 219 343 std::cerr << std::endl << "---End of AST, begin error message:---\n" << std::endl; 220 } // if344 } 221 345 e.print( std::cerr ); 222 346 if ( output != &std::cout ) { … … 243 367 } // main 244 368 245 void parse_cmdline( int argc, char * argv[], const char *& filename ) { 246 enum { Ast, Bbox, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 247 248 static struct option long_opts[] = { 249 { "ast", no_argument, 0, Ast }, 250 { "before-box", no_argument, 0, Bbox }, 251 { "before-resolver", no_argument, 0, Bresolver }, 252 { "ctorinitfix", no_argument, 0, CtorInitFix }, 253 { "expr", no_argument, 0, Expr }, 254 { "expralt", no_argument, 0, ExprAlt }, 255 { "grammar", no_argument, 0, Grammar }, 256 { "libcfa", no_argument, 0, LibCFA }, 257 { "no-preamble", no_argument, 0, Nopreamble }, 258 { "parse", no_argument, 0, Parse }, 259 { "no-prototypes", no_argument, 0, Prototypes }, 260 { "resolver", no_argument, 0, Resolver }, 261 { "symbol", no_argument, 0, Symbol }, 262 { "tree", no_argument, 0, Tree }, 263 { "validate", no_argument, 0, Validate }, 264 { 0, 0, 0, 0 } 265 }; // long_opts 266 int long_index; 267 268 opterr = 0; // (global) prevent getopt from printing error messages 269 270 int c; 271 while ( (c = getopt_long( argc, argv, "abBcefglnpqrstvyzD:F:", long_opts, &long_index )) != -1 ) { 272 switch ( c ) { 273 case Ast: 274 case 'a': // dump AST 275 astp = true; 276 break; 277 case Bresolver: 278 case 'b': // print before resolver steps 279 bresolvep = true; 280 break; 281 case 'B': // print before resolver steps 282 bboxp = true; 283 break; 284 case CtorInitFix: 285 case 'c': 286 ctorinitp = true; 287 break; 288 case Expr: 289 case 'e': // dump AST after expression analysis 290 exprp = true; 291 break; 292 case ExprAlt: 293 case 'f': // print alternatives for expressions 294 expraltp = true; 295 break; 296 case Grammar: 297 case 'g': // bison debugging info (grammar rules) 298 yydebug = true; 299 break; 300 case LibCFA: 301 case 'l': // generate libcfa.c 302 libcfap = true; 303 break; 304 case Nopreamble: 305 case 'n': // do not read preamble 306 nopreludep = true; 307 break; 308 case Prototypes: 309 case 'p': // generate prototypes for preamble functions 310 noprotop = true; 311 break; 312 case Parse: 313 case 'q': // dump parse tree 314 parsep = true; 315 break; 316 case Resolver: 317 case 'r': // print resolver steps 318 resolvep = true; 319 break; 320 case Symbol: 321 case 's': // print symbol table events 322 symtabp = true; 323 break; 324 case Tree: 325 case 't': // build in tree 326 treep = true; 327 break; 328 case 'v': // dump AST after decl validation pass 329 validp = true; 330 break; 331 case 'y': 332 errorp = true; 333 break; 334 case 'z': 335 codegenp = true; 336 break; 337 case 'D': // ignore -Dxxx 338 break; 339 case 'F': // source file-name without suffix 340 filename = optarg; 341 break; 342 case '?': 343 assertf( false, "Unknown option: '%c'\n", (char)optopt ); 344 default: 345 abort(); 346 } // switch 347 } // while 348 } // parse_cmdline 349 350 static void parse( FILE * input, LinkageSpec::Spec linkage, bool shouldExit ) { 351 extern int yyparse( void ); 352 extern FILE * yyin; 353 extern int yylineno; 354 355 ::linkage = linkage; // set globals 356 yyin = input; 357 yylineno = 1; 358 typedefTable.enterScope(); 359 int parseStatus = yyparse(); 369 static void parse( FILE * input, LinkageSpec::Type linkage, bool shouldExit ) { 370 Parser::get_parser().set_linkage( linkage ); 371 Parser::get_parser().parse( input ); 360 372 361 373 fclose( input ); 362 if ( shouldExit || parseStatus!= 0 ) {363 exit( parseStatus);374 if ( shouldExit || Parser::get_parser().get_parseStatus() != 0 ) { 375 exit( Parser::get_parser().get_parseStatus() ); 364 376 } // if 365 } // parse377 } 366 378 367 379 static bool notPrelude( Declaration * decl ) { 368 380 return ! LinkageSpec::isBuiltin( decl->get_linkage() ); 369 } // notPrelude381 } 370 382 371 383 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out ) { 372 384 std::list< Declaration * > decls; 373 374 385 if ( noprotop ) { 375 filter( translationUnit.begin(), translationUnit.end(), std::back_inserter( decls ), notPrelude ); 386 filter( translationUnit.begin(), translationUnit.end(), 387 std::back_inserter( decls ), notPrelude ); 376 388 } else { 377 389 decls = translationUnit; 378 } // if390 } 379 391 380 392 printAll( decls, out ); 381 393 deleteAll( translationUnit ); 382 } // dump 394 } 395 383 396 384 397 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.