Changeset 8c17ab0 for translator/main.cc


Ignore:
Timestamp:
Nov 13, 2014, 3:09:54 PM (10 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
Children:
c8ffe20b
Parents:
134b86a
Message:

add quoted identifiers, add compilation include directory, reformatted some files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • translator/main.cc

    r134b86a r8c17ab0  
    3838extern "C"{
    3939#include <unistd.h>
    40   extern int  getopt(int, char *const *, const char *);
    41   extern char *optarg;
    42   extern int opterr, optind, optopt;
     40extern int  getopt( int, char *const *, const char * );
     41extern char *optarg;
     42extern int opterr, optind, optopt;
    4343}
    4444
     
    4747bool beVerbose = false;
    4848
    49 int main(int argc, char *argv[]){
    50   bool debugp = false, treep = false, astp = false, manglep = false, symtabp = false, validp = false;
    51   bool preludep = true, protop = false, libp = false;
    52   bool exprp = false;
    53   int c;
    54   FILE *input, *prelude, *builtins;
    55   std::ostream *output = &std::cout;
    56 
    57   opterr = 0;
    58 
    59   while((c = getopt(argc, argv, "dtsgmvxcenplD:")) != -1) {
    60     switch(c){
    61     case 'd':
    62       /* bison debugging info */
    63       debugp = true;
    64       break;
    65     case 't':
    66       /* dump parse tree */
    67       treep = true;
    68       break;
    69     case 's':
    70       /* dump AST */
    71       astp = true;
    72       break;
    73      case 'g':
    74        /* print alternatives for expressions */
    75        manglep = true;
    76        break;
    77      case 'm':
    78        /* print symbol table events */
    79        symtabp = true;
    80        break;
    81     case 'x':
    82       /* dump AST after decl validation pass */
    83       validp = true;
    84       break;
    85     case 'e':
    86       /* dump AST after expression analysis */
    87       exprp = true;
    88       break;
    89     case 'n':
    90       /* don't read preamble */
    91       preludep = false;
    92       break;
    93     case 'p':
    94       /* generate prototypes for preamble functions */
    95       protop = true;
    96       break;
    97     case 'l':
    98       /* generate libcfa.c */
    99       libp = true;
    100       break;
    101     case 'v':
    102       /* verbose */
    103       beVerbose = true;
    104       break;
    105     case 'D':
    106       /* ignore -Dxxx */
    107       break;
    108     case '?':
    109       cout << "Unknown option: '" << (char)optopt << "'" << endl;
    110       exit(1);
    111     default:
    112       abort();
     49int main( int argc, char *argv[] ) {
     50    bool debugp = false, treep = false, astp = false, manglep = false, symtabp = false, validp = false;
     51    bool preludep = true, protop = false, libp = false;
     52    bool exprp = false;
     53    int c;
     54    FILE *input, *prelude, *builtins;
     55    std::ostream *output = &std::cout;
     56
     57    opterr = 0;
     58
     59    while ( (c = getopt( argc, argv, "dtsgmvxcenplD:" )) != -1 ) {
     60        switch (c) {
     61          case 'd':
     62            /* bison debugging info */
     63            debugp = true;
     64            break;
     65          case 't':
     66            /* dump parse tree */
     67            treep = true;
     68            break;
     69          case 's':
     70            /* dump AST */
     71            astp = true;
     72            break;
     73          case 'g':
     74            /* print alternatives for expressions */
     75            manglep = true;
     76            break;
     77          case 'm':
     78            /* print symbol table events */
     79            symtabp = true;
     80            break;
     81          case 'x':
     82            /* dump AST after decl validation pass */
     83            validp = true;
     84            break;
     85          case 'e':
     86            /* dump AST after expression analysis */
     87            exprp = true;
     88            break;
     89          case 'n':
     90            /* don't read preamble */
     91            preludep = false;
     92            break;
     93          case 'p':
     94            /* generate prototypes for preamble functions */
     95            protop = true;
     96            break;
     97          case 'l':
     98            /* generate libcfa.c */
     99            libp = true;
     100            break;
     101          case 'v':
     102            /* verbose */
     103            beVerbose = true;
     104            break;
     105          case 'D':
     106            /* ignore -Dxxx */
     107            break;
     108          case '?':
     109            cout << "Unknown option: '" << (char)optopt << "'" << endl;
     110            exit(1);
     111          default:
     112            abort();
     113        }
    113114    }
    114   }
    115 
    116   try {
    117     if( optind < argc ) {
    118       input = fopen( argv[ optind ], "r" );
    119       if( !input ) {
    120         std::cout << "Error: can't open " << argv[optind] << std::endl;
    121         exit( 1 );
    122       }
    123       optind++;
    124     } else {
    125       input = stdin;
     115
     116    try {
     117        if ( optind < argc ) {
     118            input = fopen( argv[ optind ], "r" );
     119            if ( !input ) {
     120                std::cout << "Error: can't open " << argv[optind] << std::endl;
     121                exit( 1 );
     122            }
     123            optind++;
     124        } else {
     125            input = stdin;
     126        }
     127
     128        if ( optind < argc ) {
     129            output = new ofstream( argv[ optind ] );
     130        }
     131   
     132        Parser::get_parser().set_debug( debugp );
     133   
     134        if ( preludep ) {
     135            // include gcc builtins
     136            builtins = open_builtins();
     137            if ( !builtins ) {
     138                std::cout << "Error: can't open builtins" << std::endl;
     139                exit( 1 );
     140            }
     141     
     142            Parser::get_parser().set_linkage( LinkageSpec::Compiler );
     143            Parser::get_parser().parse( builtins );
     144   
     145            if ( Parser::get_parser().get_parseStatus() != 0 ) {
     146                return Parser::get_parser().get_parseStatus();
     147            }
     148            fclose( builtins );
     149
     150            // include cfa prelude
     151            if ( libp ) {
     152                prelude = input;
     153            } else {
     154                prelude = open_prelude();
     155            }
     156            if ( !prelude ) {
     157                std::cout << "Error: can't open prelude" << std::endl;
     158                exit( 1 );
     159            }
     160     
     161            Parser::get_parser().set_linkage( LinkageSpec::Intrinsic );
     162            Parser::get_parser().parse( prelude );
     163   
     164            if ( Parser::get_parser().get_parseStatus() != 0 ) {
     165                return Parser::get_parser().get_parseStatus();
     166            }
     167            fclose( prelude );
     168        }
     169   
     170        if ( libp ) {
     171            std::list< Declaration* > translationUnit;
     172            buildList( Parser::get_parser().get_parseTree(), translationUnit );
     173            Parser::get_parser().freeTree();
     174            SymTab::validate( translationUnit, false );
     175            CodeGen::fixNames( translationUnit );
     176            LibCfa::makeLibCfa( translationUnit );
     177            ResolvExpr::resolve( translationUnit );
     178            GenPoly::convertLvalue( translationUnit );
     179            GenPoly::box( translationUnit );
     180            CodeGen::generate( translationUnit, *output, true );
     181            if ( output != &std::cout ) {
     182                delete output;
     183            }
     184            return 0;
     185        }
     186   
     187        Parser::get_parser().set_linkage( LinkageSpec::Cforall );
     188 
     189        Parser::get_parser().parse( input );
     190        if ( debugp || Parser::get_parser().get_parseStatus() != 0 ) {
     191            return Parser::get_parser().get_parseStatus();
     192        }
     193        fclose( input );
     194 
     195        if ( treep ) {
     196            Parser::get_parser().get_parseTree()->printList( std::cout );
     197            Parser::get_parser().freeTree();
     198            return 0;
     199        }
     200
     201        std::list< Declaration* > translationUnit;
     202        buildList( Parser::get_parser().get_parseTree(), translationUnit );
     203
     204        Parser::get_parser().freeTree();
     205        if ( astp ) {
     206            printAll( translationUnit, std::cout );
     207            return 0;
     208        }
     209
     210        if ( manglep ) {
     211            SymTab::validate( translationUnit, false );
     212            ResolvExpr::AlternativePrinter printer( std::cout );
     213            acceptAll( translationUnit, printer );
     214            return 0;
     215        }
     216
     217        if ( symtabp ) {
     218            SymTab::validate( translationUnit, true );
     219            return 0;
     220        }
     221
     222        if ( validp ) {
     223            SymTab::validate( translationUnit, false );
     224            printAll( translationUnit, std::cout );
     225            return 0;
     226        }
     227        if ( exprp ) {
     228            SymTab::validate( translationUnit, false );
     229            ResolvExpr::resolve( translationUnit );
     230            printAll( translationUnit, std::cout );
     231            return 0;
     232        }
     233
     234        SymTab::validate( translationUnit, false );
     235        //Try::visit( translationUnit );
     236        //Tuples::mutate( translationUnit );
     237        //InitTweak::mutate( translationUnit );
     238        ControlStruct::mutate( translationUnit );
     239        CodeGen::fixNames( translationUnit );
     240        ResolvExpr::resolve( translationUnit );
     241        //Tuples::checkFunctions( translationUnit );
     242        //      std::cerr << "Finished tuple checkfunctions" << std::endl;
     243        //printAll( translationUnit, std::cerr );
     244        GenPoly::copyParams( translationUnit );
     245        GenPoly::convertSpecializations( translationUnit );
     246        GenPoly::convertLvalue( translationUnit );
     247        GenPoly::box( translationUnit );
     248        //Tuples::mutate( translationUnit );
     249
     250        CodeGen::generate( translationUnit, *output, protop );
     251
     252        if ( output != &std::cout ) {
     253            delete output;
     254        }
     255
     256    } catch ( SemanticError &e ) {
     257        e.print( cout );
     258        if ( output != &std::cout ) {
     259            delete output;
     260        }
     261        return 1;
     262    } catch ( UnimplementedError &e ) {
     263        std::cout << "Sorry, " << e.get_what() << " is not currently implemented" << std::endl;
     264        if ( output != &std::cout ) {
     265            delete output;
     266        }
     267        return 1;
     268    } catch ( CompilerError &e ) {
     269        std::cerr << "Compiler Error: " << e.get_what() << std::endl;
     270        std::cerr << "(please report bugs to " << std::endl;
     271        if ( output != &std::cout ) {
     272            delete output;
     273        }
     274        return 1;
    126275    }
    127276
    128     if( optind < argc ) {
    129       output = new ofstream( argv[ optind ] );
     277    return 0;
     278}
     279
     280FILE *open_prelude() {
     281    FILE *ret;
     282
     283    const string name("prelude.cf"),
     284        full_name = string(CFA_LIBDIR) + "/" + name;
     285
     286    if ( beVerbose ) {
     287        cout << "Reading from " << full_name << endl;
    130288    }
    131    
    132     Parser::get_parser().set_debug( debugp );
    133    
    134     if( preludep ) {
    135       // include gcc builtins
    136       builtins = open_builtins();
    137       if( !builtins ) {
    138         std::cout << "Error: can't open builtins" << std::endl;
    139         exit( 1 );
    140       }
    141      
    142       Parser::get_parser().set_linkage( LinkageSpec::Compiler );
    143       Parser::get_parser().parse( builtins );
    144    
    145       if( Parser::get_parser().get_parseStatus() != 0 ) {
    146         return Parser::get_parser().get_parseStatus();
    147       }
    148       fclose( builtins );
    149 
    150       // include cfa prelude
    151       if( libp ) {
    152         prelude = input;
    153       } else {
    154         prelude = open_prelude();
    155       }
    156       if( !prelude ) {
    157         std::cout << "Error: can't open prelude" << std::endl;
    158         exit( 1 );
    159       }
    160      
    161       Parser::get_parser().set_linkage( LinkageSpec::Intrinsic );
    162       Parser::get_parser().parse( prelude );
    163    
    164       if( Parser::get_parser().get_parseStatus() != 0 ) {
    165         return Parser::get_parser().get_parseStatus();
    166       }
    167       fclose( prelude );
     289
     290    if (! (ret = fopen(full_name.c_str(), "r" ) ) )
     291        return fopen(name.c_str(), "r" );             // trying current directory
     292    else
     293        return ret;
     294}
     295
     296FILE *open_builtins() {
     297    FILE *ret;
     298
     299    const char *name = "builtins.cf";
     300    const char *full_name = CFA_LIBDIR "/builtins.cf";
     301
     302    if ( beVerbose ) {
     303        cout << "Reading from " << full_name << endl;
    168304    }
    169    
    170     if( libp ) {
    171       std::list< Declaration* > translationUnit;
    172       buildList( Parser::get_parser().get_parseTree(), translationUnit );
    173       Parser::get_parser().freeTree();
    174       SymTab::validate( translationUnit, false );
    175       CodeGen::fixNames( translationUnit );
    176       LibCfa::makeLibCfa( translationUnit );
    177       ResolvExpr::resolve( translationUnit );
    178       GenPoly::convertLvalue( translationUnit );
    179       GenPoly::box( translationUnit );
    180       CodeGen::generate( translationUnit, *output, true );
    181       if( output != &std::cout ) {
    182         delete output;
    183       }
    184       return 0;
    185     }
    186    
    187     Parser::get_parser().set_linkage( LinkageSpec::Cforall );
    188  
    189     Parser::get_parser().parse( input );
    190     if( debugp || Parser::get_parser().get_parseStatus() != 0 ) {
    191       return Parser::get_parser().get_parseStatus();
    192     }
    193     fclose( input );
    194  
    195     if( treep ) {
    196       Parser::get_parser().get_parseTree()->printList( std::cout );
    197       Parser::get_parser().freeTree();
    198       return 0;
    199     }
    200 
    201     std::list< Declaration* > translationUnit;
    202     buildList( Parser::get_parser().get_parseTree(), translationUnit );
    203 
    204     Parser::get_parser().freeTree();
    205     if( astp ) {
    206       printAll( translationUnit, std::cout );
    207       return 0;
    208     }
    209 
    210     if( manglep ) {
    211       SymTab::validate( translationUnit, false );
    212       ResolvExpr::AlternativePrinter printer( std::cout );
    213       acceptAll( translationUnit, printer );
    214       return 0;
    215     }
    216 
    217     if( symtabp ) {
    218       SymTab::validate( translationUnit, true );
    219       return 0;
    220     }
    221 
    222     if( validp ) {
    223       SymTab::validate( translationUnit, false );
    224       printAll( translationUnit, std::cout );
    225       return 0;
    226     }
    227     if( exprp ) {
    228       SymTab::validate( translationUnit, false );
    229       ResolvExpr::resolve( translationUnit );
    230       printAll( translationUnit, std::cout );
    231       return 0;
    232     }
    233 
    234     SymTab::validate( translationUnit, false );
    235     //Try::visit( translationUnit );
    236     //Tuples::mutate( translationUnit );
    237     //InitTweak::mutate( translationUnit );
    238     ControlStruct::mutate( translationUnit );
    239     CodeGen::fixNames( translationUnit );
    240     ResolvExpr::resolve( translationUnit );
    241     //Tuples::checkFunctions( translationUnit );
    242     //      std::cerr << "Finished tuple checkfunctions" << std::endl;
    243     //printAll( translationUnit, std::cerr );
    244     GenPoly::copyParams( translationUnit );
    245     GenPoly::convertSpecializations( translationUnit );
    246     GenPoly::convertLvalue( translationUnit );
    247     GenPoly::box( translationUnit );
    248     //Tuples::mutate( translationUnit );
    249 
    250     CodeGen::generate( translationUnit, *output, protop );
    251 
    252     if( output != &std::cout ) {
    253         delete output;
    254     }
    255 
    256   } catch ( SemanticError &e ) {
    257     e.print( cout );
    258     if( output != &std::cout ) {
    259       delete output;
    260     }
    261     return 1;
    262   } catch ( UnimplementedError &e ) {
    263     std::cout << "Sorry, " << e.get_what() << " is not currently implemented" << std::endl;
    264     if( output != &std::cout ) {
    265       delete output;
    266     }
    267     return 1;
    268   } catch ( CompilerError &e ) {
    269     std::cerr << "Compiler Error: " << e.get_what() << std::endl;
    270     std::cerr << "(please report bugs to " << std::endl;
    271     if( output != &std::cout ) {
    272       delete output;
    273     }
    274     return 1;
    275   }
    276 
    277   return 0;
    278 }
    279 
    280 FILE *open_prelude(){
    281   FILE *ret;
    282 
    283   const string name("prelude.cf"),
    284                full_name = string(CFA_LIBDIR) + "/" + name;
    285 
    286   if( beVerbose ) {
    287     cout << "Reading from " << full_name << endl;
    288   }
    289 
    290   if (! (ret = fopen(full_name.c_str(), "r" ) ) )
    291     return fopen(name.c_str(), "r" );             // trying current directory
    292   else
    293     return ret;
    294 }
    295 
    296 FILE *open_builtins(){
    297   FILE *ret;
    298 
    299   const char *name = "builtins.cf";
    300   const char *full_name = CFA_LIBDIR "/builtins.cf";
    301 
    302   if( beVerbose ) {
    303     cout << "Reading from " << full_name << endl;
    304   }
    305 
    306   if (! (ret = fopen(full_name, "r" ) ) )
    307     return fopen(name, "r" );             // trying current directory
    308   else
    309     return ret;
     305
     306    if (! (ret = fopen(full_name, "r" ) ) )
     307        return fopen(name, "r" );                       // trying current directory
     308    else
     309        return ret;
    310310}
    311311
Note: See TracChangeset for help on using the changeset viewer.