You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

223 lines
5.4 KiB

/*
* This file is part of the program ltl2dstar (http://www.ltl2dstar.de/).
* Copyright (C) 2005-2007 Joachim Klein <j.klein@ltl2dstar.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef LTL2NBA_HPP
#define LTL2NBA_HPP
/** @file
* Provides wrapper classes for external LTL-to-Buechi translators.
*/
#include "NBA.hpp"
#include "LTLFormula.hpp"
#include "common/RunProgram.hpp"
#include "parsers/parser_interface.hpp"
#include <cstdio>
/**
* Virtual base class for wrappers to external LTL-to-Buechi translators.
*/
template <class NBA_t>
class LTL2NBA {
public:
/** Constructor */
LTL2NBA() {}
/** Destructor */
virtual ~LTL2NBA() {}
/** Convert an LTL formula to an NBA */
virtual NBA_t *ltl2nba(LTLFormula& ltl) = 0;
};
/**
* Wrapper for external LTL-to-Buechi translators using the SPIN interface.
*/
template <class NBA_t>
class LTL2NBA_SPIN : public LTL2NBA<NBA_t> {
public:
/**
* Constructor
* @param path path to the executable
* @param arguments vector of command line arguments to be passed to the external translator
*/
LTL2NBA_SPIN(std::string path,
std::vector<std::string> arguments=std::vector<std::string>()) :
_path(path), _arguments(arguments) {}
/** Destructor */
virtual ~LTL2NBA_SPIN() {}
/**
* Convert an LTL formula to an NBA
* @param ltl
* @return a pointer to the created NBA (caller gets ownership).
*/
virtual
NBA_t *ltl2nba(LTLFormula& ltl) {
// Create canonical APSet (with 'p0', 'p1', ... as AP)
LTLFormula_ptr ltl_canonical=ltl.copy();
APSet_cp canonical_apset(ltl.getAPSet()->createCanonical());
ltl_canonical->switchAPSet(canonical_apset);
AnonymousTempFile spin_outfile;
std::vector<std::string> arguments;
arguments.push_back("-f");
arguments.push_back(ltl_canonical->toStringInfix());
arguments.insert(arguments.end(),
_arguments.begin(),
_arguments.end());
const char *program_path=_path.c_str();
RunProgram spin(program_path,
arguments,
false,
0,
&spin_outfile,
0);
int rv=spin.waitForTermination();
if (rv==0) {
NBA_t *result_nba(new NBA_t(canonical_apset));
FILE *f=spin_outfile.getInFILEStream();
if (f==NULL) {
throw Exception("");
}
int rc=nba_parser_promela::parse(f, result_nba);
fclose(f);
if (rc!=0) {
throw Exception("Couldn't parse PROMELA file!");
}
// switch back to original APSet
result_nba->switchAPSet(ltl.getAPSet());
return result_nba;
} else {
// There was an error, return null ptr
return (NBA_t *)0;
}
}
private:
/** The path */
std::string _path;
/** The arguments */
std::vector<std::string> _arguments;
};
/**
* Wrapper for external LTL-to-Buechi translators using the LBTT interface.
*/
template <class NBA_t>
class LTL2NBA_LBTT : public LTL2NBA<NBA_t> {
public:
/**
* Constructor
* @param path path to the executable
* @param arguments vector of command line arguments to be passed to the external translator
*/
LTL2NBA_LBTT(std::string path,
std::vector<std::string> arguments=std::vector<std::string>()) :
_path(path), _arguments(arguments) {}
/** Destructor */
virtual ~LTL2NBA_LBTT() {}
/**
* Convert an LTL formula to an NBA
* @param ltl
* @return a pointer to the created NBA (caller gets ownership).
*/
virtual NBA_t *ltl2nba(LTLFormula& ltl) {
// Create canonical APSet (with 'p0', 'p1', ... as AP)
LTLFormula_ptr ltl_canonical=ltl.copy();
APSet_cp canonical_apset(ltl.getAPSet()->createCanonical());
ltl_canonical->switchAPSet(canonical_apset);
NamedTempFile infile(true);
NamedTempFile outfile(true);
std::ostream& o=infile.getOStream();
o << ltl_canonical->toStringPrefix() << std::endl;
o.flush();
std::vector<std::string> arguments(_arguments);
arguments.push_back(infile.getFileName());
arguments.push_back(outfile.getFileName());
const char *program_path=_path.c_str();
RunProgram ltl2nba_lbtt(program_path,
arguments,
false,
0,
0,
0);
int rv=ltl2nba_lbtt.waitForTermination();
if (rv==0) {
NBA_t *result_nba=new NBA_t(ltl_canonical->getAPSet());
FILE *f=outfile.getInFILEStream();
if (f==NULL) {
throw Exception("");
}
int rc=nba_parser_lbtt::parse(f, result_nba);
fclose(f);
if (rc!=0) {
throw Exception("Couldn't parse LBTT file!");
}
// result_nba->print(std::cerr);
// switch back to original APSet
result_nba->switchAPSet(ltl.getAPSet());
return result_nba;
} else {
// There was an error, return null ptr
return (NBA_t *)0;
}
}
private:
/** The path */
std::string _path;
/** The arguments */
std::vector<std::string> _arguments;
};
#endif