Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/main.cc

    r0da3e2c r7880579  
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Aug 16 17:47:52 2016
    13 // Update Count     : 252
     12// Last Modified On : Mon Aug 15 17:58:57 2016
     13// Update Count     : 220
    1414//
    1515
     
    1717#include <fstream>
    1818#include <getopt.h>
    19 #include "Parser/lex.h"
    20 #include "Parser/parser.h"
    21 #include "Parser/TypedefTable.h"
     19#include "Parser/Parser.h"
    2220#include "SynTree/Declaration.h"
    2321#include "SynTree/Visitor.h"
     
    4947using namespace std;
    5048
    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
     52static void parse( FILE * input, LinkageSpec::Type t, bool shouldExit = false );
     53static void dump( std::list< Declaration * > & translationUnit, std::ostream & out = std::cout );
    5854
    5955bool
     
    7672        codegenp = false;
    7773
    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 
     74enum { Ast, Bbox, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, };
     75
     76static 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};
    8294
    8395int main( int argc, char *argv[] ) {
    8496        FILE *input;
    8597        std::ostream *output = &std::cout;
     98        int long_index;
    8699        std::list< Declaration * > translationUnit;
    87100        const char *filename = NULL;
    88101
    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
    90183
    91184        try {
     
    113206                } // if
    114207
    115                 yydebug = grammarp;
     208                Parser::get_parser().set_debug( grammarp );
    116209
    117210                // read in the builtins, extras, and the prelude
     
    148241
    149242                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();
    158251                if ( astp ) {
    159252                        dump( translationUnit );
     
    268361} // main
    269362
    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();
     363static void parse( FILE * input, LinkageSpec::Type linkage, bool shouldExit ) {
     364        Parser::get_parser().set_linkage( linkage );
     365        Parser::get_parser().parse( input );
    386366
    387367        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() );
    390370        } // if
    391 } // parse
     371}
    392372
    393373static bool notPrelude( Declaration * decl ) {
    394374        return ! LinkageSpec::isBuiltin( decl->get_linkage() );
    395 } // notPrelude
     375}
    396376
    397377static void dump( std::list< Declaration * > & translationUnit, std::ostream & out ) {
     
    405385        printAll( decls, out );
    406386        deleteAll( translationUnit );
    407 } // dump
     387}
     388
    408389
    409390// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.