Ejemplo n.º 1
0
void main()
{
	try
	{
	std::stack<PNode<XMLValue>*> *nStack = new std::stack<PNode<XMLValue>*>;
	PNode<XMLValue>* rootnode = new PNode<XMLValue>(XMLValue(XMLValue::TAG,"Document"));
	XMLTree* xtree = new XMLTree(rootnode);
	ParserState* ps = new ParserState;
	
	Toker* pToker = new Toker;
	pToker->setMode(Toker::xml);          //XML parser mode
    XmlParts* pSemi = new XmlParts(pToker);
    Parser* pParser = new Parser(pSemi);

	ElementEnd* pElementendrule = new ElementEnd(nStack,ps);
	ElementStart* pElementstartrule = new ElementStart(nStack,ps);
	ElementSelfClosed* pElementselfcrule = new ElementSelfClosed(nStack,ps);
	Text* ptextrule = new Text(nStack,ps);
	Comment* pCommentrule = new Comment(nStack,ps);
	ProcInstr* pIinstrrule = new ProcInstr(nStack,ps);

	EndFound* pEndact = new EndFound(nStack,xtree);
	StartFound* pStartact = new StartFound(nStack,xtree);
	SelfClosedFound* pSelfClosedact = new SelfClosedFound(nStack,xtree);
	TextFound* pTextact = new TextFound(nStack,xtree);
	CommentFound* pCommentact = new CommentFound(nStack,xtree);
	ProcInstrFound* pInstract = new ProcInstrFound(nStack,xtree);
	
	pElementendrule->addAction(pEndact);
	pElementstartrule->addAction(pStartact);
	pElementselfcrule->addAction(pSelfClosedact);
	ptextrule->addAction(pTextact);
	pCommentrule->addAction(pCommentact);
	pIinstrrule->addAction(pInstract);
	
	pParser->addRule(pElementendrule);
	pParser->addRule(pElementstartrule);
	pParser->addRule(pElementselfcrule);
	pParser->addRule(ptextrule);
	pParser->addRule(pCommentrule);
	pParser->addRule(pIinstrrule);
	    

	nStack->push(rootnode);

	if(pParser)
    {
		if(! pToker->attach("..\\LectureNote.xml"))
        {
	      std::cout << "\n  could not open file "  << std::endl;
          return;
        }
     }

	while(pParser->next())
       pParser->parse();
	
	//display the tree and the rebuilt xml
	XMLDisplay disply(xtree);
	//generate the string of tree and rebuilt xml
	disply.buildTreeDisplay();
	disply.rebuildXML();
	//attach the output file to the display object
	disply.AttachFile("..\\output.txt");
	//display them
	std::cout<<"=======================Parser Tree====================="<<std::endl;
	std::cout<<disply.OutputTree();
	
      std::cout << "\n\n";

	std::cout<<"=====================Rebuild XML====================="<<std::endl;
	std::cout<<disply.OutputXML();
	
	delete pEndact;
	delete pStartact;
	delete pSelfClosedact;
	delete pTextact;
	delete pCommentact;
	delete pInstract;
	
	delete pElementendrule;
	delete pElementstartrule;
	delete pElementselfcrule;
	delete ptextrule;
	delete pCommentrule;
	delete pIinstrrule;

	delete pToker;
	delete pSemi;
	delete pParser;

	delete ps;
	delete nStack;
	
	xtree->remove(xtree->getroot());
	std::vector< PNode<XMLValue>* > deletednodes = xtree->getdeletednodes();
	for(size_t i = 0; i < deletednodes.size(); ++i)
		delete deletednodes[i];
	delete xtree;

  }
  catch(std::exception& ex)
  {
    std::cout << "\n\n  " << ex.what() << "\n\n";
  }	
  ::system("pause");
}
int main(int argc, char* argv[])
{
	std::cout << "\n  Testing Tokenizer class\n "
		<< std::string(25, '=') << std::endl;
	std::cout
		<< "\n  Note that comments and quotes are returned as single tokens\n\n";

	// collecting tokens from a string

	Toker t_fromStr("tokens from a string: -> int x; /* a comment */", false);
	std::string tok;
	do
	{
		tok = t_fromStr.getTok();
		std::cout << "  " << tok;
	} while (tok != "");
	std::cout << "\n\n";

	// collecting tokens from files, named on the command line

	if (argc < 2)
	{
		std::cout
			<< "\n  please enter name of file to process on command line\n\n";
		return 1;
	}

	for (int i = 1; i<argc; ++i)
	{
		std::cout << "\n  Processing file " << argv[i];
		std::cout << "\n  " << std::string(16 + strlen(argv[i]), '-') << "\n";

		try
		{
			Toker t;
			t.setMode(Toker::xml);        // comment out to show tokenizing for code
			//    t.setSingleCharTokens("<>");  // will return same results as above for XML

			if (!t.attach(argv[i]))
			{
				std::cout << "\n    can't open file " << argv[i] << "\n\n";
				continue;
			}
			t.returnComments();  // remove this statement to discard comment tokens
			std::string temp;
			do
			{
				temp = t.getTok();
				std::cout << "  ln: " << t.lines() << ", br lev: "
					<< t.braceLevel() << ", tok size: " << std::setw(3) << temp.length() << " -- ";
				if (temp != "\n")
					std::cout << temp << std::endl;
				else
					std::cout << "newline\n";
			} while (temp != "");
		}
		catch (std::exception& ex)
		{
			std::cout << "  " << ex.what() << "\n\n";
		}
	}
}