Exemplo n.º 1
0
bool GPT::parse(list<pair<string,istream*> >& istream_list) {
  stringstream s;
  
  try {
    TokenStreamSelector*  selector = new TokenStreamSelector;
    
    //codigo desgracado, mas faz o que deve
    //1: controle de multiplos tokenStreams
    //2: utilizar o filename adequado para error reporting

    PortugolLexer* lexer;
    PortugolLexer* prev = 0;
    PortugolLexer* fst = 0;
    string firstFile;
    int c = 0;
    for(list<pair<string,istream*> >::reverse_iterator it = istream_list.rbegin(); 
           it != istream_list.rend(); 
           ++it, ++c) 
    {
      lexer = new PortugolLexer(*((*it).second), selector);
      
      selector->addInputStream(lexer, (*it).first);
      selector->select(lexer);
      selector->push((*it).first);
      if(!firstFile.empty()) {
        lexer->setNextFilename(firstFile);
      } 

      prev = lexer;
      GPTDisplay::self()->addFileName((*it).first);

      firstFile = (*it).first;
      fst = lexer;
    }

    selector->select(fst);
    
    PortugolParser parser(*selector);

    GPTDisplay::self()->setCurrentFile(firstFile);
    
    ASTFactory ast_factory(PortugolAST::TYPE_NAME,&PortugolAST::factory);
    parser.initializeASTFactory(ast_factory);
    parser.setASTFactory(&ast_factory);

    parser.algoritmo();
    if(_outputfile.empty()) {
      _outputfile = parser.nomeAlgoritmo();
    }

    if(GPTDisplay::self()->hasError()) {
      GPTDisplay::self()->showErrors();
      return false;
    }

    _astree = parser.getPortugolAST();

    if(!_astree) {
      s << PACKAGE << ": erro interno: no parse tree" << endl;
      GPTDisplay::self()->showError(s);
      return false;
    }

    if(_printParseTree) {
      std::cerr << _astree->toStringList() << std::endl << std::endl;
    }

    SemanticWalker semantic(_stable);
    semantic.algoritmo(_astree);

    if(GPTDisplay::self()->hasError()) {
      GPTDisplay::self()->showErrors();
      return false;
    }
    return true;
  }
  catch(ANTLRException& e) {
    s << PACKAGE << ": erro interno: " << e.toString() << endl;
    GPTDisplay::self()->showError(s);
    return false;
  }
  catch(exception& e) {
    s << PACKAGE << ": erro interno: " << e.what() << endl;
    GPTDisplay::self()->showError(s);
    return false;
  }

  s << "GPT::parse: bug, nao deveria executar essa linha!" << endl;
  GPTDisplay::self()->showError(s);
  return false;
}
Exemplo n.º 2
0
int eeemain_parse(int argc, char** args)
{
	using namespace std;
	using namespace antlr;
	using namespace ff;

	try {
		istream* input;

		if (argc > 1) {
			input = new ifstream(args[1], ios::in);
		} else {
			input = &cin;
		}

		TokenStreamSelector selector;

		FjolnirForritLexer forritLexer(*input);
		forritLexer.initialize(&selector);

		FjolnirEiningLexer einingLexer(forritLexer.getInputState());
		einingLexer.initialize(&selector);

		selector.addInputStream(&forritLexer, "forritlexer");
		selector.addInputStream(&einingLexer, "eininglexer");
		selector.select("forritlexer");

		ASTFactory my_factory;
		FjolnirParser parser(selector);

		parser.initializeASTFactory(my_factory);
		parser.setASTFactory(&my_factory);

		parser.forrit();
		RefAST ast = RefAST(parser.getAST());

		// cout << "Fyrir transformation:" << endl;
		if (ast) {
			// printTree(ast, cout, parser);
		} else {
			cout << "null AST" << endl;
		}

		FjolnirTransformer tparser;
		tparser.initializeASTFactory(my_factory);
		tparser.setASTFactory(&my_factory);
		tparser.forrit(ast);
		RefAST transformed = RefAST(tparser.getAST());

		// cout << endl << "Eftir fasa 2:" << endl;
		if (ast) {
			// printTree(transformed, cout, parser);
			cout << "digraph G {" << endl;
			cout << "edge [fontname=\"Helvetica\",fontsize=10,labelfontname=\"Helvetica\",labelfontsize=10];" << endl;
			cout << "node [fontname=\"Helvetica\",fontsize=10,shape=box];" << endl;
			printDotTree(transformed, cout, parser);
			cout << "}" << endl;
		} else {
			cout << "null AST" << endl;
		}

	} catch(exception& e) {
		cerr << "exception: " << e.what() << endl;
	}

	return 0;
}