Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
adiff.cpp 1.88 KiB
//============================================================================
// Name        : adiff.cpp
// Author      : Honza
// Version     :
// Copyright   : 
// Description :
//============================================================================

#include <iostream>

#include "automaton/UnknownAutomaton.h"
#include "grammar/UnknownGrammar.h"
#include "factory/DataFactory.hpp"
#include "exception/AlibException.h"

#include "AutomatonDiff.h"
#include "GrammarDiff.h"

int main(int argc, char** argv) {

	try {

		if (argc == 2 && std::string("-h").compare(argv[1]) == 0) {
			std::cout << "Diff." << std::endl << "Usage: adiff file.xml file.xml" << std::endl;
			return -1;
		}

		std::list<sax::Token> tokens1;
		std::list<sax::Token> tokens2;

		if (argc == 3) {
			sax::SaxParseInterface::parseFile(argv[1], tokens1);
			sax::SaxParseInterface::parseFile(argv[2], tokens2);

			if(alib::FromXMLParsers::automatonParser.first(tokens1) && alib::FromXMLParsers::automatonParser.first(tokens2)) {
				automaton::Automaton automaton1 = alib::DataFactory::fromTokens<automaton::Automaton>(tokens1);
				automaton::Automaton automaton2 = alib::DataFactory::fromTokens<automaton::Automaton>(tokens2);

				return AutomatonDiff::diff(automaton1, automaton2);
			}

			if(alib::FromXMLParsers::grammarParser.first(tokens1) && alib::FromXMLParsers::grammarParser.first(tokens2)) {
				grammar::Grammar grammar1 = alib::DataFactory::fromTokens<grammar::Grammar>(tokens1);
				grammar::Grammar grammar2 = alib::DataFactory::fromTokens<grammar::Grammar>(tokens2);

				return GrammarDiff::diff(grammar1, grammar2);
			}

			std::cout << "Only automata and grammars can be differenciated." << std::endl;
			return 2;
		}

		std::cout << "Nothing to differ." << std::endl;
		return -1;

	} catch (const exception::AlibException& e) {
		std::cout << e.getCause() << std::endl;
		return 1;
	} catch (...) {
		return 127;
	}
}