summaryrefslogtreecommitdiffstats
path: root/src/uscxml/transform/FSMToPromela.h
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-10-20 07:20:16 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-10-20 07:20:16 (GMT)
commit59c9ae81b4911c6458cbe8a5ed78554bdcc82861 (patch)
treeaab941294ccd67c8379f2dfb71ca107236d51f05 /src/uscxml/transform/FSMToPromela.h
parent9ba649b087df2bc161759e55549facc2f8f80878 (diff)
downloaduscxml-59c9ae81b4911c6458cbe8a5ed78554bdcc82861.zip
uscxml-59c9ae81b4911c6458cbe8a5ed78554bdcc82861.tar.gz
uscxml-59c9ae81b4911c6458cbe8a5ed78554bdcc82861.tar.bz2
SCXML -> Promela skips intermediate explicit flat SCXML for ridiculous better memory footprint
Diffstat (limited to 'src/uscxml/transform/FSMToPromela.h')
-rw-r--r--src/uscxml/transform/FSMToPromela.h272
1 files changed, 0 insertions, 272 deletions
diff --git a/src/uscxml/transform/FSMToPromela.h b/src/uscxml/transform/FSMToPromela.h
deleted file mode 100644
index 3a9e263..0000000
--- a/src/uscxml/transform/FSMToPromela.h
+++ /dev/null
@@ -1,272 +0,0 @@
-/**
- * @file
- * @author 2012-2014 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de)
- * @copyright Simplified BSD
- *
- * @cond
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the FreeBSD license as published by the FreeBSD
- * project.
- *
- * 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.
- *
- * You should have received a copy of the FreeBSD license along with this
- * program. If not, see <http://www.opensource.org/licenses/bsd-license>.
- * @endcond
- */
-
-#ifndef FSMTOPROMELA_H_RP48RFDJ
-#define FSMTOPROMELA_H_RP48RFDJ
-
-#include "uscxml/interpreter/InterpreterDraft6.h"
-#include "uscxml/DOMUtils.h"
-#include "uscxml/util/Trie.h"
-
-#include <DOM/Document.hpp>
-#include <DOM/Node.hpp>
-#include <XPath/XPath.hpp>
-#include <ostream>
-
-namespace uscxml {
-
-class USCXML_API PromelaInline {
-public:
- PromelaInline() : type(PROMELA_NIL) {}
-
- operator bool() {
- return (type != PROMELA_NIL);
- }
-
- void dump();
-
- enum PromelaInlineType {
- PROMELA_NIL,
- PROMELA_CODE,
- PROMELA_EVENT_SOURCE,
- PROMELA_EVENT_SOURCE_CUSTOM,
- PROMELA_PROGRESS_LABEL,
- PROMELA_ACCEPT_LABEL,
- PROMELA_END_LABEL
- };
-
- std::string content;
- std::list<std::list<std::string> > sequences;
-
- PromelaInlineType type;
-};
-
-class USCXML_API PromelaInlines {
-public:
- PromelaInlines() : progressLabels(0), acceptLabels(0), endLabels(0), eventSources(0), customEventSources(0), codes(0) {}
-
- void merge(const PromelaInlines& other) {
- inlines.insert(inlines.end(), other.inlines.begin(), other.inlines.end());
- progressLabels += other.progressLabels;
- acceptLabels += other.acceptLabels;
- endLabels += other.endLabels;
- eventSources += other.eventSources;
- customEventSources += other.customEventSources;
- codes += other.codes;
- }
-
- operator bool() {
- return inlines.size() > 0;
- }
-
- std::list<PromelaInline> inlines;
- int progressLabels;
- int acceptLabels;
- int endLabels;
- int eventSources;
- int customEventSources;
- int codes;
-};
-
-class USCXML_API PromelaCodeAnalyzer {
-public:
- class PromelaTypedef {
- public:
- PromelaTypedef() : arraySize(0) {}
- std::string name;
- std::string type;
- size_t arraySize;
- std::map<std::string, PromelaTypedef> types;
-
- bool operator==(const PromelaTypedef& other) const {
- return name == other.name;
- }
-
- };
-
- PromelaCodeAnalyzer() : _eventTrie("."), _lastStrIndex(1), _lastStateIndex(0), _lastEventIndex(1), _usesInPredicate(false), _usesPlatformVars(false) {
- }
-
- void addCode(const std::string& code);
- void addEvent(const std::string& eventName);
- void addState(const std::string& stateName);
- void addLiteral(const std::string& stateName, int forceIndex = -1);
-
- bool usesComplexEventStruct() {
- return _typeDefs.types.find("_event") != _typeDefs.types.end();
- }
- bool usesEventField(const std::string& fieldName) {
- if (usesComplexEventStruct() && _typeDefs.types["_event"].types.find(fieldName) != _typeDefs.types["_event"].types.end())
- return true;
- return false;
- }
-
- bool usesInPredicate() {
- return _usesInPredicate;
- }
- bool usesPlatformVars() {
- return _usesPlatformVars;
- }
-
- std::string macroForLiteral(const std::string& literal);
- int indexForLiteral(const std::string& literal);
- int arrayIndexForOrigState(const std::string& stateName);
-
- std::set<std::string> getLiterals() {
- return _strLiterals;
- }
- std::set<std::string> getEventsWithPrefix(const std::string& prefix);
- std::map<std::string, int>& getEvents() {
- return _events;
- }
-
- std::map<std::string, int>& getStates() {
- return _states;
- }
-
- std::map<std::string, int>& getOrigStates() {
- return _origStateIndex;
- }
-
- std::list<std::string>& getOrigStates(const std::string& state) {
- if (_origStateMap.find(state) == _origStateMap.end())
- throw std::runtime_error("No original states known for " + state);
- return _origStateMap[state];
- }
-
- Trie& getTrie() {
- return _eventTrie;
- }
-
- std::string replaceLiterals(const std::string code);
-
- PromelaTypedef getTypes() {
- return _typeDefs;
- }
-
-protected:
- std::string createMacroName(const std::string& literal);
- int enumerateLiteral(const std::string& literal, int forceIndex = -1);
-
- std::set<std::string> _strLiterals; // all string literals
- std::map<std::string, std::string> _strMacroNames; // macronames for string literals
- std::map<std::string, int> _strIndex; // integer enumeration for string
- std::map<std::string, int> _origStateIndex; // state enumeration for original states
-
- std::map<std::string, int> _states;
- std::map<std::string, std::list<std::string> > _origStateMap; // states from the original state chart
- std::map<std::string, int> _events;
-
- PromelaTypedef _typeDefs;
-
- Trie _eventTrie;
-
-private:
- std::set<std::string> _macroNameSet; // helper set for uniqueness of macros
- int _lastStrIndex;
- int _lastStateIndex;
- int _lastEventIndex;
- bool _usesInPredicate;
- bool _usesPlatformVars;
-};
-
-class USCXML_API PromelaEventSource {
-public:
-
- enum PromelaEventSourceType {
- PROMELA_EVENT_SOURCE_INVALID,
- PROMELA_EVENT_SOURCE_INVOKER,
- PROMELA_EVENT_SOURCE_GLOBAL,
- };
-
- PromelaEventSource();
- PromelaEventSource(const PromelaInlines& sources, const Arabica::DOM::Node<std::string>& parent);
-
- void writeStartEventSources(std::ostream& stream, int indent = 0);
- void writeStopEventSources(std::ostream& stream, int indent = 0);
- void writeDeclarations(std::ostream& stream, int indent = 0);
- void writeEventSource(std::ostream& stream);
-
- operator bool() {
- return type != PROMELA_EVENT_SOURCE_INVALID;
- }
-
- std::string name;
- PromelaInlines eventSources;
- Arabica::DOM::Node<std::string> container;
- PromelaEventSourceType type;
- PromelaCodeAnalyzer* analyzer;
-};
-
-class USCXML_API FSMToPromela : public InterpreterDraft6 {
-public:
- static void writeProgram(std::ostream& stream,
- const Interpreter& interpreter);
-
- static std::string beautifyIndentation(const std::string& code, int indent = 0);
-
-protected:
- FSMToPromela();
- void writeProgram(std::ostream& stream);
-
- void initNodes();
-
- void writeEvents(std::ostream& stream);
- void writeStates(std::ostream& stream);
- void writeStateMap(std::ostream& stream);
- void writeTypeDefs(std::ostream& stream);
- void writeStrings(std::ostream& stream);
- void writeDeclarations(std::ostream& stream);
- void writeEventSources(std::ostream& stream);
- void writeExecutableContent(std::ostream& stream, const Arabica::DOM::Node<std::string>& node, int indent = 0);
- void writeInlineComment(std::ostream& stream, const Arabica::DOM::Node<std::string>& node);
- void writeFSM(std::ostream& stream);
- void writeEventDispatching(std::ostream& stream);
- void writeMain(std::ostream& stream);
-
- void writeIfBlock(std::ostream& stream, const Arabica::XPath::NodeSet<std::string>& condChain, int indent = 0);
- void writeDispatchingBlock(std::ostream& stream, const Arabica::XPath::NodeSet<std::string>& transChain, int indent = 0);
-
- Arabica::XPath::NodeSet<std::string> getTransientContent(const Arabica::DOM::Element<std::string>& state, const std::string& source = "");
- Arabica::DOM::Node<std::string> getUltimateTarget(const Arabica::DOM::Element<std::string>& transition);
-
- static PromelaInlines getInlinePromela(const std::string&);
- static PromelaInlines getInlinePromela(const Arabica::XPath::NodeSet<std::string>& elements, bool recurse = false);
- static PromelaInlines getInlinePromela(const Arabica::DOM::Node<std::string>& elements);
-
-// std::string replaceStringsInExpression(const std::string& expr);
-
- std::string sanitizeCode(const std::string& code);
-
- Arabica::XPath::NodeSet<std::string> _globalStates;
- Arabica::DOM::Node<std::string> _startState;
- std::map<std::string, Arabica::DOM::Element<std::string> > _states;
- std::map<Arabica::DOM::Element<std::string>, int> _transitions;
-
- std::list<std::string> _varInitializers;
-
- PromelaCodeAnalyzer _analyzer;
-
- std::map<std::string, PromelaEventSource> _invokers;
- PromelaEventSource _globalEventSource;
-};
-
-}
-
-#endif /* end of include guard: FSMTOPROMELA_H_RP48RFDJ */