diff --git a/.gitignore b/.gitignore index 50c54fd62596e4456e880b36549a11e5a6663d22..95e0f357f21a767fa401ad5017fd57360cda55a0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ *.lai *.la *.a + +# vim backup files +*~ diff --git a/acat/src/acat.cpp b/acat/src/acat.cpp index 1512f7b1f574e950913567fabb99c5ecd62d316e..d21642240eb5dbfb645796b321c67969c4605012 100644 --- a/acat/src/acat.cpp +++ b/acat/src/acat.cpp @@ -8,17 +8,22 @@ #include <set> #include "AutomatonFactory.h" +#include "GrammarFactory.h" #include "AlibException.h" #include "automaton/AutomatonParser.h" +#include "grammar/GrammarParser.h" +#include "grammar/GrammarPrinter.h" using namespace std; using namespace automaton; using namespace alib; using namespace sax; +using namespace grammar; int main(int argc, char** argv) { UnknownAutomaton* automaton; + Grammar* grammar; try { if (argc > 1) { @@ -26,17 +31,22 @@ int main(int argc, char** argv) { cout << "Automaton parsing.\nUsage: catPDA [automaton.xml]\n"; return -1; } - automaton = AutomatonFactory::fromFile(argv[1]); +// automaton = AutomatonFactory::fromFile(argv[1]); + grammar = GrammarFactory::fromFile(argv[1]); } else { string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>())); - automaton = AutomatonFactory::fromString(input); + // automaton = AutomatonFactory::fromString(input); + grammar = GrammarFactory::fromString(input); } - Automaton* knownAutomaton = AutomatonFactory::buildAutomaton(automaton); + /* Automaton* knownAutomaton = AutomatonFactory::buildAutomaton(automaton); knownAutomaton->toXML(cout); delete automaton; delete knownAutomaton; + */ + + GrammarPrinter::toXML(*grammar, cout); } catch (AlibException& e) { cout << e.what() << endl; diff --git a/alib/.cproject b/alib/.cproject index cedc067963fcac0c5f01a72d3e0f3a27da0937b1..1cafe9e7111b5ccbcaf646b7bbc8543e1cd506e5 100644 --- a/alib/.cproject +++ b/alib/.cproject @@ -33,6 +33,7 @@ <option id="gnu.cpp.compiler.option.include.paths.1670765613" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> <listOptionValue builtIn="false" value="/usr/include/libxml2/"/> </option> + <option id="gnu.cpp.compiler.option.other.other.389461226" superClass="gnu.cpp.compiler.option.other.other" value="-c -fmessage-length=0 -std=c++11" valueType="string"/> <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.62684000" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> </tool> <tool id="cdt.managedbuild.tool.gnu.c.compiler.so.debug.44664480" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.so.debug"> @@ -51,8 +52,8 @@ <option id="gnu.cpp.link.option.paths.181283166" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths"> <listOptionValue builtIn="false" value=""/> </option> - <option id="gnu.cpp.link.option.userobjs.1375511055" superClass="gnu.cpp.link.option.userobjs" valueType="userObjs"/> - <option id="gnu.cpp.link.option.flags.1738094424" superClass="gnu.cpp.link.option.flags" value="-fvisibility=hidden" valueType="string"/> + <option id="gnu.cpp.link.option.userobjs.1375511055" name="Other objects" superClass="gnu.cpp.link.option.userobjs"/> + <option id="gnu.cpp.link.option.flags.1738094424" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-fvisibility=hidden" valueType="string"/> <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1254427525" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> <additionalInput kind="additionalinput" paths="$(LIBS)"/> @@ -132,8 +133,8 @@ <resource resourceType="PROJECT" workspacePath="/alib"/> </configuration> <configuration configurationName="Debug"> - <resource resourceType="PROJECT" workspacePath="/aconvert"/> <resource resourceType="PROJECT" workspacePath="/alib"/> + <resource resourceType="PROJECT" workspacePath="/aconvert"/> <resource resourceType="PROJECT" workspacePath="/acat"/> </configuration> </storageModule> diff --git a/alib/src/AutomatonFactory.cpp b/alib/src/AutomatonFactory.cpp index 1a444857bdb2f7dc54d187f8c3fd5a78d5bc2dce..132914c285106d80c473c218e27a012ec14285d9 100644 --- a/alib/src/AutomatonFactory.cpp +++ b/alib/src/AutomatonFactory.cpp @@ -18,19 +18,19 @@ namespace automaton { using namespace sax; -UnknownAutomaton* AutomatonFactory::fromFile(const std::string& filename) { - std::list<Token> tokens; +UnknownAutomaton* AutomatonFactory::fromFile(const string& filename) { + list<Token> tokens; SaxInterface::parseFile(filename, tokens); return parse(tokens); } -UnknownAutomaton* AutomatonFactory::fromString(const std::string& str) { - std::list<Token> tokens; +UnknownAutomaton* AutomatonFactory::fromString(const string& str) { + list<Token> tokens; SaxInterface::parseMemory(str, tokens); return parse(tokens); } -UnknownAutomaton* AutomatonFactory::parse(std::list<sax::Token> tokens) { +UnknownAutomaton* AutomatonFactory::parse(list<Token> tokens) { AutomatonParser parser; return parser.parse(tokens); } diff --git a/alib/src/AutomatonFactory.h b/alib/src/AutomatonFactory.h index b116b70fc9a21f47189a217809649afa085b8ee8..736096196360ca2d03b6e77313e55991b3a596f2 100644 --- a/alib/src/AutomatonFactory.h +++ b/alib/src/AutomatonFactory.h @@ -17,10 +17,12 @@ namespace automaton { +using namespace std; + class AutomatonFactory { public: - static UnknownAutomaton* fromFile(const std::string& filename); - static UnknownAutomaton* fromString(const std::string& str); + static UnknownAutomaton* fromFile(const string& filename); + static UnknownAutomaton* fromString(const string& str); static Automaton* buildAutomaton(UnknownAutomaton* automaton); @@ -34,7 +36,7 @@ public: static TM buildTM(UnknownAutomaton* automaton); protected: - static UnknownAutomaton* parse(std::list<sax::Token> tokens); + static UnknownAutomaton* parse(list<sax::Token> tokens); static void buildCommon(Automaton& automaton, UnknownAutomaton* unknownAutomaton); diff --git a/alib/src/GrammarFactory.cpp b/alib/src/GrammarFactory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d51090ae3a949263a70b7aeaed52f45d5dcb3fca --- /dev/null +++ b/alib/src/GrammarFactory.cpp @@ -0,0 +1,35 @@ +/* + * GrammarFactory.cpp + * + * Created on: Nov 5, 2013 + * Author: martin + */ + +#include "GrammarFactory.h" + +#include "sax/SaxInterface.h" +#include "grammar/GrammarParser.h" + +namespace grammar { + + + +UnknownGrammar* GrammarFactory::fromFile(const string& filename) { + std::list<Token> tokens; + SaxInterface::parseFile(filename, tokens); + return parse(tokens); +} + +UnknownGrammar* GrammarFactory::fromString(const string& str) { + list<Token> tokens; + SaxInterface::parseMemory(str, tokens); + return parse(tokens); +} + +UnknownGrammar* GrammarFactory::parse(list<sax::Token> tokens) { + GrammarParser parser; + return parser.parse(tokens); +} + +} /* namespace grammar */ + diff --git a/alib/src/GrammarFactory.h b/alib/src/GrammarFactory.h new file mode 100644 index 0000000000000000000000000000000000000000..0745391c520be76fedcdf882837d48cc8b9112d0 --- /dev/null +++ b/alib/src/GrammarFactory.h @@ -0,0 +1,29 @@ +/* + * GrammarFactory.h + * + * Created on: Nov 5, 2013 + * Author: Martin Zak + */ + +#ifndef GRAMMARFACTORY_H_ +#define GRAMMARFACTORY_H_ + +#include "grammar/UnknownGrammar.h" +#include "sax/Token.h" + +namespace grammar { + +using namespace std; +using namespace sax; + +class GrammarFactory { +public: + static UnknownGrammar* fromFile(const string& filename); + static UnknownGrammar* fromString(const string& str); + +protected: + static UnknownGrammar* parse(list<Token> tokens); +}; + +} /* namespace grammar */ +#endif /* GRAMMARFACTORY_H_ */ diff --git a/alib/src/automaton/FSM/FSM.cpp b/alib/src/automaton/FSM/FSM.cpp index a5b55a8de0411d929dca8928e226e9c09a3697d7..cc608131b0bb11b88404e817457c116422df3181 100644 --- a/alib/src/automaton/FSM/FSM.cpp +++ b/alib/src/automaton/FSM/FSM.cpp @@ -55,29 +55,33 @@ void FSM::removeInputSymbol(const Symbol& symbol) { } -void FSM::addTransition(const State& current, const Symbol& input, const State& next) { - if (states.find(current) == states.end()) - throw AutomatonException("State \"" + current.getName() + "\" doesn't exist."); +void FSM::addTransition(const State& from, const Symbol& input, const State& to) { + addTransition(TransitionFSM(from, input, to)); +} + +void FSM::addTransition(const TransitionFSM& transition) { + const State& from = transition.getFrom(); + const Symbol& input = transition.getInput(); + const State& to = transition.getTo(); + + if (states.find(from) == states.end()) + throw AutomatonException("State \"" + from.getName() + "\" doesn't exist."); if (input.getSymbol() != "") { if (inputAlphabet.find(input) == inputAlphabet.end()) throw AutomatonException("Input symbol \"" + input.getSymbol() + "\" doesn't exist."); } - if (states.find(next) == states.end()) - throw AutomatonException("State \"" + next.getName() + "\" doesn't exist."); + if (states.find(to) == states.end()) + throw AutomatonException("State \"" + to.getName() + "\" doesn't exist."); - pair<set<TransitionFSM>::iterator, bool> ret = transitions.insert(TransitionFSM(current, input, next)); + pair<set<TransitionFSM>::iterator, bool> ret = transitions.insert(transition); if (!ret.second) throw AutomatonException( - "Transition (\"" + current.getName() + "\", \"" + input.getSymbol() + "\") -> \"" + next.getName() + "Transition (\"" + from.getName() + "\", \"" + input.getSymbol() + "\") -> \"" + to.getName() + "\" already exists."); } -void FSM::addTransition(const TransitionFSM& transition) { - addTransition(transition.getFrom(), transition.getInput(), transition.getTo()); -} - void FSM::removeTransition(const TransitionFSM& transition) { int removed = transitions.erase(transition); if (!removed) diff --git a/alib/src/grammar/Grammar.cpp b/alib/src/grammar/Grammar.cpp index 0bcebd7187804d1a553cd4258b971c8866a2d53b..2a44a3f5445263cf9f416607e9a85e507a399fbe 100644 --- a/alib/src/grammar/Grammar.cpp +++ b/alib/src/grammar/Grammar.cpp @@ -78,7 +78,7 @@ const set<Rule>& Grammar::getRules() const { return rules; } -const Symbol& Grammar::getStartSymbol() { +const Symbol& Grammar::getStartSymbol() const{ return startSymbol; } diff --git a/alib/src/grammar/Grammar.h b/alib/src/grammar/Grammar.h index a72468e4d4fb6de8f1f95b4655411b417a8d0e39..2a53cca30949783b60599905ac5cb24a0f22ddc9 100644 --- a/alib/src/grammar/Grammar.h +++ b/alib/src/grammar/Grammar.h @@ -40,7 +40,7 @@ public: void removeRule(const Rule& rule); const set<Rule>& getRules() const; - const Symbol& getStartSymbol(); + const Symbol& getStartSymbol() const; void setStartSymbol(const Symbol& symbol); }; diff --git a/alib/src/grammar/GrammarPrinter.cpp b/alib/src/grammar/GrammarPrinter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..10122134fdc14aa7058b35dfbe483b92ceea7728 --- /dev/null +++ b/alib/src/grammar/GrammarPrinter.cpp @@ -0,0 +1,66 @@ +/* + * GrammarPrinter.cpp + * + * Created on: Nov 5, 2013 + * Author: martin + */ + +#include "GrammarPrinter.h" + +namespace grammar { + +void GrammarPrinter::toXML(const Grammar& grammar, ostream& out) { + out << "<grammar>\n"; + printNonTerminals(grammar, out); + printTerminals(grammar, out); + printRules(grammar, out); + printStartSymbol(grammar, out); + out << "</grammar>\n"; +} + +void GrammarPrinter::printNonTerminals(const Grammar& grammar, ostream& out) { + out << "<nonTerminalSymbols>\n"; + for (auto &symbol : grammar.getNonTerminalSymbols()) { + symbol.toXML(out, ""); + } + out << "</nonTerminalSymbols>\n"; +} + +void GrammarPrinter::printTerminals(const Grammar& grammar, ostream& out) { + out << "<terminalSymbols>\n"; + for (auto& symbol : grammar.getTerminalSymbols()) { + symbol.toXML(out, ""); + } + out << "</terminalSymbols>\n"; +} + +void GrammarPrinter::printRules(const Grammar& grammar, ostream& out) { + out << "<rules>\n"; + for (auto& rule : grammar.getRules()) { + printRule(rule, out); + } + out << "</rules>\n"; +} + +void GrammarPrinter::printRule(const Rule& rule, ostream& out) { + out << "<rule>\n"; + out << "<leftSide>\n"; + for (auto& symbol : rule.getLeftSide()) { + symbol.toXML(out, ""); + } + out << "</leftSide>\n"; + out << "<rightSide>\n"; + for (auto& symbol : rule.getRightSide()) { + symbol.toXML(out, ""); + } + out << "</rightSide>\n"; + out << "</rule>\n"; +} + +void GrammarPrinter::printStartSymbol(const Grammar& grammar, ostream& out) { + out << "<startSymbol>"; + out << grammar.getStartSymbol().getSymbol(); + out << "</startSymbol>\n"; +} + +} /* namespace grammar */ diff --git a/alib/src/grammar/GrammarPrinter.h b/alib/src/grammar/GrammarPrinter.h new file mode 100644 index 0000000000000000000000000000000000000000..28a15c0bea4d16730ffd7d4c523fe2a82aeb757c --- /dev/null +++ b/alib/src/grammar/GrammarPrinter.h @@ -0,0 +1,31 @@ +/* + * GrammarPrinter.h + * + * Created on: Nov 5, 2013 + * Author: martin + */ + +#ifndef GRAMMARPRINTER_H_ +#define GRAMMARPRINTER_H_ + +#include <ostream> +#include "Grammar.h" + +namespace grammar { + +using namespace std; + +class GrammarPrinter { +public: + static void toXML(const Grammar& grammar, ostream& out); +protected: + static void printNonTerminals(const Grammar& grammar, ostream& out); + static void printTerminals(const Grammar& grammar, ostream& out); + static void printRules(const Grammar& grammar, ostream& out); + static void printRule(const Rule& rule, ostream& out); + static void printStartSymbol(const Grammar& grammar, ostream& out); + +}; + +} /* namespace grammar */ +#endif /* GRAMMARPRINTER_H_ */ diff --git a/examples/grammar/regular.xml b/examples/grammar/regular.xml new file mode 100644 index 0000000000000000000000000000000000000000..18e5614bb0b362bfc0fc52998f67ea34cb19f715 --- /dev/null +++ b/examples/grammar/regular.xml @@ -0,0 +1,34 @@ +<grammar> + <nonTerminalSymbols> + <symbol>S</symbol> + <symbol>A</symbol> + </nonTerminalSymbols> + + <terminalSymbols> + <symbol>a</symbol> + </terminalSymbols> + + <rules> + <rule> + <leftSide> + <symbol>S</symbol> + </leftSide> + + <rightSide> + <symbol>A</symbol> + </rightSide> + </rule> + <rule> + <leftSide> + <symbol>A</symbol> + </leftSide> + + <rightSide> + <symbol>a</symbol> + </rightSide> + </rule> + </rules> + + <startSymbol>S</startSymbol> + +</grammar>