示例#1
0
int 
main(int argc, char *argv[], char *envp[]) {

  string ccCmd;
  int optionsOK = parseOptions(argc, argv);
  if (optionsOK < 0)
	return -1;

  cppShellCmd += inputFile;
  cppShellCmd += " ";

  /* ccCmd = "mv ";
  ccCmd += outputFile;
  ccCmd += " ";
  ccCmd += outputFile;
  ccCmd += ".c; ";
  ccCmd += ccShellCmd;
  if (genSharedLib)
	ccCmd += "-shared ";
  ccCmd += "-o ";
  ccCmd += outputFile;*/

  if ((yyin = popen(cppShellCmd.c_str(), "r")) == NULL) {
    cerr << "Unexpected error in reading input file\n";
    return 1;
  }

#ifdef TEST_LEXER
  int token;

  while (token = yylex()) {
	if (token == TOK_SYNTAX_ERROR) {
	  cout << yyfilename << ":" << yylinenum 
		   << ": Error: Unrecognized token `" << yytext << "'\n";
	}
	else {
      cout << "Token: " << token << " ";
      switch(token)
        {
        case TOK_UINTNUM:
          cout << "Attribute: (int) " << yylval.uVal;
          break;

        case TOK_DOUBLENUM:
          cout << "Attribute: (float) " << yylval.dVal;
          break;

        case TOK_STRCONST:
          cout << "Attribute: (string) " << yylval.cVal;
          break;

        case TOK_ID:
          cout << "Attribute: (id) " << yylval.cVal;
          break;

        default:
          break;
        }
      cout << endl;
	}
  }

  return 0;
#else
  //   yydebug = 1;
  any = new EventEntry("any");
  if (stm.insert(any) == OK) {
    Type *te = new Type((vector<Type*>*)NULL, Type::EVENT);
    any->type(te);
  }
  yyparse();
  stm.leaveToScope(SymTabEntry::Kind::GLOBAL_KIND);
  GlobalEntry *ge = (GlobalEntry*)(stm.currentScope());
  if (ge != NULL) {
	cout << "Finished parsing, here is the AST\n";
  
  if(errCount() == 0){
    cout << "Type checking" << endl;
    ge->typeCheck();
    //ge->typePrint(cout,0);
  }
  if(errCount() == 0){
    cout << "Memory alloaction" << endl;
    MemoryMgr mm = MemoryMgr();
    ge->memAlloc(mm);
  }

  if(errCount() == 0){
    cout << "Code Generation" << endl;

    CodeBlock* prog = ge->codeGen();
    prog->Optimize();
    if(outputFile.size() == 0){
      cout << endl << endl;
      prog->print(cout);  
      cout << endl << endl;
    } else {
      ofstream ofs(outputFile,ofstream::out);
      prog->print(ofs);
    }
  }

  }
#endif
}