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; }
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; }