From ec7fabb1f0422b432e4100c5f68329f71dc1de2f Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 29 Sep 2014 08:21:57 +0200 Subject: [PATCH] Hexavigesimal labels --- alib2data/src/Api.cpp | 12 ++++ alib2data/src/Api.hpp | 7 +++ alib2data/src/label/HexavigesimalLabel.cpp | 59 ++++++++++++++++++ alib2data/src/label/HexavigesimalLabel.h | 61 +++++++++++++++++++ alib2data/src/label/LabelBase.h | 2 +- alib2data/src/label/LabelFeatures.h | 1 + alib2data/src/label/LabelFromStringParser.cpp | 2 +- alib2data/src/label/LabelFromXMLParser.cpp | 12 +++- alib2data/src/label/LabelFromXMLParser.h | 2 + alib2data/src/label/LabelToStringComposer.cpp | 7 +++ alib2data/src/label/LabelToStringComposer.h | 1 + alib2data/src/label/LabelToXMLComposer.cpp | 8 +++ alib2data/src/label/LabelToXMLComposer.h | 1 + alib2data/src/label/NextLabel.cpp | 7 +++ alib2data/src/label/NextLabel.h | 1 + alib2data/src/object/ObjectBase.h | 5 +- alib2data/src/std/hexavigesimal.cpp | 23 +++++-- alib2data/src/std/hexavigesimal.h | 4 +- 18 files changed, 203 insertions(+), 12 deletions(-) create mode 100644 alib2data/src/label/HexavigesimalLabel.cpp create mode 100644 alib2data/src/label/HexavigesimalLabel.h diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 6257489711..22d1416d4b 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -388,6 +388,14 @@ std::list<sax::Token> api<label::PrimitiveLabel>::compose(const label::Primitive return ToXMLComposers::labelComposer.compose(data); } +label::HexavigesimalLabel api<label::HexavigesimalLabel>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::labelParser.parseHexavigesimalLabel(input); +} + +std::list<sax::Token> api<label::HexavigesimalLabel>::compose(const label::HexavigesimalLabel& data) { + return ToXMLComposers::labelComposer.compose(data); +} + label::ObjectLabel api<label::ObjectLabel>::parse(std::list<sax::Token>& input) { return FromXMLParsers::labelParser.parseObjectLabel(input); } @@ -656,6 +664,10 @@ void ToXMLComposers::Visit(void* data, const label::PrimitiveLabel& label) const *((std::list<sax::Token>*) data) = std::move(api<label::PrimitiveLabel>::compose(label)); } +void ToXMLComposers::Visit(void* data, const label::HexavigesimalLabel& label) const { + *((std::list<sax::Token>*) data) = std::move(api<label::HexavigesimalLabel>::compose(label)); +} + void ToXMLComposers::Visit(void* data, const label::ObjectLabel& label) const { *((std::list<sax::Token>*) data) = std::move(api<label::ObjectLabel>::compose(label)); } diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index 74cad3c649..28dfdc7df1 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -326,6 +326,12 @@ struct api<label::PrimitiveLabel> { static std::list<sax::Token> compose(const label::PrimitiveLabel& data); }; +template<> +struct api<label::HexavigesimalLabel> { + static label::HexavigesimalLabel parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const label::HexavigesimalLabel& data); +}; + template<> struct api<label::ObjectLabel> { static label::ObjectLabel parse(std::list<sax::Token>& input); @@ -485,6 +491,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const; void Visit(void*, const label::PrimitiveLabel& label) const; + void Visit(void*, const label::HexavigesimalLabel& label) const; void Visit(void*, const label::ObjectLabel& label) const; void Visit(void*, const label::LabelSetLabel& label) const; void Visit(void*, const label::LabelPairLabel& label) const; diff --git a/alib2data/src/label/HexavigesimalLabel.cpp b/alib2data/src/label/HexavigesimalLabel.cpp new file mode 100644 index 0000000000..58c101f8af --- /dev/null +++ b/alib2data/src/label/HexavigesimalLabel.cpp @@ -0,0 +1,59 @@ +/* + * HexavigesimalLabel.cpp + * + * Created on: Mar 26, 2013 + * Author: Jan Travicek + */ + +#include "HexavigesimalLabel.h" +#include "../std/hexavigesimal.h" + +namespace label { + +HexavigesimalLabel::HexavigesimalLabel(int hexavigesimal) : hexavigesimal(hexavigesimal) { + +} + +LabelBase* HexavigesimalLabel::clone() const { + return new HexavigesimalLabel(*this); +} + +LabelBase* HexavigesimalLabel::plunder() && { + return new HexavigesimalLabel(std::move(*this)); +} + +int HexavigesimalLabel::getData() const { + return hexavigesimal; +} + +bool HexavigesimalLabel::operator<(const alib::ObjectBase& other) const { + return other > *this; +} + +bool HexavigesimalLabel::operator==(const alib::ObjectBase& other) const { + return other == *this; +} + +bool HexavigesimalLabel::operator >(const alib::ObjectBase& other) const { + return other < *this; +} + + +bool HexavigesimalLabel::operator <(const HexavigesimalLabel& other) const { + return hexavigesimal < other.hexavigesimal; +} + +bool HexavigesimalLabel::operator ==(const HexavigesimalLabel& other) const { + return hexavigesimal == other.hexavigesimal; +} + +void HexavigesimalLabel::operator>>(std::ostream& out) const { + out << "(HexavigesimalLabel " << std::toBase26(hexavigesimal) << ")"; +} + +HexavigesimalLabel::operator std::string() const { + return std::toBase26(hexavigesimal); +} + +} /* namespace label */ + diff --git a/alib2data/src/label/HexavigesimalLabel.h b/alib2data/src/label/HexavigesimalLabel.h new file mode 100644 index 0000000000..d0a883a77e --- /dev/null +++ b/alib2data/src/label/HexavigesimalLabel.h @@ -0,0 +1,61 @@ +/* + * HexavigesimalLabel.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef HEXAVIGESIMAL_LABEL_H_ +#define HEXAVIGESIMAL_LABEL_H_ + +#include "../std/hexavigesimal.h" +#include <ostream> + +#include "LabelBase.h" + +namespace label { + +/** + * Represents symbol in an alphabet. + */ +class HexavigesimalLabel : public std::acceptor<HexavigesimalLabel, VisitableLabelBase, std::acceptor<HexavigesimalLabel, alib::VisitableObjectBase, LabelBase> > { +protected: + int hexavigesimal; +public: + virtual LabelBase* clone() const; + + virtual LabelBase* plunder() &&; + + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit HexavigesimalLabel(int hexavigesimal); + + virtual bool operator<(const alib::ObjectBase& other) const; + + virtual bool operator>(const alib::ObjectBase& other) const; + + virtual bool operator==(const alib::ObjectBase& other) const; + + /** + * @return name of the symbol + */ + int getData() const; + + virtual bool operator <(const HexavigesimalLabel& other) const; + virtual bool operator ==(const HexavigesimalLabel& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string () const; + + virtual int selfTypeId() const { + return typeId(*this); + } +}; + +} /* namespace label */ + +#endif /* HEXAVIGESIMAL_LABEL_H_ */ + diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h index 9e1ee9c27e..58df68b672 100644 --- a/alib2data/src/label/LabelBase.h +++ b/alib2data/src/label/LabelBase.h @@ -14,7 +14,7 @@ namespace label { typedef std::acceptor_base< - label::PrimitiveLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel + label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel > VisitableLabelBase; /** diff --git a/alib2data/src/label/LabelFeatures.h b/alib2data/src/label/LabelFeatures.h index a6cd2f7a46..7ec1c1c76b 100644 --- a/alib2data/src/label/LabelFeatures.h +++ b/alib2data/src/label/LabelFeatures.h @@ -12,6 +12,7 @@ namespace label { enum class FEATURES { PRIMITIVE, + HEXAVIGESIMAL, OBJECT, LABEL_SET, LABEL_PAIR diff --git a/alib2data/src/label/LabelFromStringParser.cpp b/alib2data/src/label/LabelFromStringParser.cpp index cb89cdf7a7..1e532ceb80 100644 --- a/alib2data/src/label/LabelFromStringParser.cpp +++ b/alib2data/src/label/LabelFromStringParser.cpp @@ -20,7 +20,7 @@ LabelFromStringParser::LabelFromStringParser(std::istream& input) : m_Lexer(inpu } Label LabelFromStringParser::parse() { - return parse(std::set<FEATURES>({FEATURES::PRIMITIVE, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); + return parse(std::set<FEATURES>({FEATURES::PRIMITIVE, FEATURES::HEXAVIGESIMAL, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); } Label LabelFromStringParser::parse(const std::set<FEATURES>& features) { diff --git a/alib2data/src/label/LabelFromXMLParser.cpp b/alib2data/src/label/LabelFromXMLParser.cpp index 471f3b0840..adcd1a45f5 100644 --- a/alib2data/src/label/LabelFromXMLParser.cpp +++ b/alib2data/src/label/LabelFromXMLParser.cpp @@ -13,13 +13,16 @@ namespace label { Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input) const { - return parseLabel(input, std::set<FEATURES>({FEATURES::PRIMITIVE, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); + return parseLabel(input, std::set<FEATURES>({FEATURES::PRIMITIVE, FEATURES::HEXAVIGESIMAL, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); } Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { if(isToken(input, sax::Token::TokenType::START_ELEMENT, "PrimitiveLabel")) { if(!features.count(FEATURES::PRIMITIVE)) throw exception::AlibException(); return Label(parsePrimitiveLabel(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "HexavigesimalLabel")) { + if(!features.count(FEATURES::HEXAVIGESIMAL)) throw exception::AlibException(); + return Label(parseHexavigesimalLabel(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel")) { if(!features.count(FEATURES::OBJECT)) throw exception::AlibException(); return Label(parseObjectLabel(input)); @@ -49,6 +52,13 @@ PrimitiveLabel LabelFromXMLParser::parsePrimitiveLabel(std::list<sax::Token>& in return data; } +HexavigesimalLabel LabelFromXMLParser::parseHexavigesimalLabel(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "HexavigesimalLabel"); + HexavigesimalLabel data(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER))); + popToken(input, sax::Token::TokenType::END_ELEMENT, "HexavigesimalLabel"); + return data; +} + ObjectLabel LabelFromXMLParser::parseObjectLabel(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel"); ObjectLabel data(alib::api<alib::Object>::parse(input)); diff --git a/alib2data/src/label/LabelFromXMLParser.h b/alib2data/src/label/LabelFromXMLParser.h index 352d11af8d..0810178486 100644 --- a/alib2data/src/label/LabelFromXMLParser.h +++ b/alib2data/src/label/LabelFromXMLParser.h @@ -14,6 +14,7 @@ #include "Label.h" #include "LabelFeatures.h" #include "PrimitiveLabel.h" +#include "HexavigesimalLabel.h" #include "ObjectLabel.h" #include "LabelSetLabel.h" #include "LabelPairLabel.h" @@ -36,6 +37,7 @@ class LabelFromXMLParser : public sax::FromXMLParserHelper { Label parseLabel(std::list<sax::Token>& input) const; PrimitiveLabel parsePrimitiveLabel(std::list<sax::Token>& input) const; + HexavigesimalLabel parseHexavigesimalLabel(std::list<sax::Token>& input) const; ObjectLabel parseObjectLabel(std::list<sax::Token>& input) const; LabelSetLabel parseLabelSetLabel(std::list<sax::Token>& input) const; LabelPairLabel parseLabelPairLabel(std::list<sax::Token>& input) const; diff --git a/alib2data/src/label/LabelToStringComposer.cpp b/alib2data/src/label/LabelToStringComposer.cpp index b3134e15f5..a4fc5dfb83 100644 --- a/alib2data/src/label/LabelToStringComposer.cpp +++ b/alib2data/src/label/LabelToStringComposer.cpp @@ -9,6 +9,7 @@ #include "../primitive/PrimitiveToStringComposer.h" #include <algorithm> #include "PrimitiveLabel.h" +#include "HexavigesimalLabel.h" #include "ObjectLabel.h" #include "LabelSetLabel.h" #include "LabelPairLabel.h" @@ -24,6 +25,12 @@ void LabelToStringComposer::Visit(void* userData, const PrimitiveLabel& label) { out << composer.compose(label.getData()); } +void LabelToStringComposer::Visit(void* userData, const HexavigesimalLabel& label) { + std::stringstream &out = *((std::stringstream*) userData); + + out << (std::string) label; +} + void LabelToStringComposer::Visit(void* userData, const ObjectLabel& label) { std::stringstream &out = *((std::stringstream*) userData); out << (std::string) label; diff --git a/alib2data/src/label/LabelToStringComposer.h b/alib2data/src/label/LabelToStringComposer.h index 8c76d72235..52cd1ca82f 100644 --- a/alib2data/src/label/LabelToStringComposer.h +++ b/alib2data/src/label/LabelToStringComposer.h @@ -19,6 +19,7 @@ namespace label { */ class LabelToStringComposer : public VisitableLabelBase::visitor_type { void Visit(void*, const PrimitiveLabel& label); + void Visit(void*, const HexavigesimalLabel& label); void Visit(void*, const ObjectLabel& label); void Visit(void*, const LabelSetLabel& label); void Visit(void*, const LabelPairLabel& label); diff --git a/alib2data/src/label/LabelToXMLComposer.cpp b/alib2data/src/label/LabelToXMLComposer.cpp index 5047282134..de7875afd3 100644 --- a/alib2data/src/label/LabelToXMLComposer.cpp +++ b/alib2data/src/label/LabelToXMLComposer.cpp @@ -32,6 +32,14 @@ std::list<sax::Token> LabelToXMLComposer::compose(const PrimitiveLabel& label) c return out; } +std::list<sax::Token> LabelToXMLComposer::compose(const HexavigesimalLabel& label) const { + std::list<sax::Token> out; + out.push_back(sax::Token("HexavigesimalLabel", sax::Token::TokenType::START_ELEMENT)); + out.push_back(sax::Token(std::itos(label.getData()), sax::Token::TokenType::CHARACTER)); + out.push_back(sax::Token("HexavigesimalLabel", sax::Token::TokenType::END_ELEMENT)); + return out; +} + std::list<sax::Token> LabelToXMLComposer::compose(const ObjectLabel& label) const { std::list<sax::Token> out; out.push_back(sax::Token("ObjectLabel", sax::Token::TokenType::START_ELEMENT)); diff --git a/alib2data/src/label/LabelToXMLComposer.h b/alib2data/src/label/LabelToXMLComposer.h index 778df93f4e..b8349e8f57 100644 --- a/alib2data/src/label/LabelToXMLComposer.h +++ b/alib2data/src/label/LabelToXMLComposer.h @@ -40,6 +40,7 @@ class LabelToXMLComposer { std::list<sax::Token> compose(const Label& label) const; std::list<sax::Token> compose(const PrimitiveLabel& label) const; + std::list<sax::Token> compose(const HexavigesimalLabel& label) const; std::list<sax::Token> compose(const ObjectLabel& label) const; std::list<sax::Token> compose(const LabelSetLabel& label) const; std::list<sax::Token> compose(const LabelPairLabel& label) const; diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp index 2796aea9e4..ed78de02f7 100644 --- a/alib2data/src/label/NextLabel.cpp +++ b/alib2data/src/label/NextLabel.cpp @@ -8,6 +8,7 @@ #include "NextLabel.h" #include "../primitive/NextPrimitive.h" #include "PrimitiveLabel.h" +#include "HexavigesimalLabel.h" #include "../std/itos.h" #include "../exception/AlibException.h" @@ -20,6 +21,12 @@ void NextLabel::Visit(void* userData, const PrimitiveLabel& label) { out = new Label(PrimitiveLabel(next.nextPrimitive(label.getData()))); } +void NextLabel::Visit(void* userData, const HexavigesimalLabel& label) { + Label* &out = *((Label**) userData); + + out = new Label(HexavigesimalLabel(label.getData() + 1)); +} + void NextLabel::Visit(void*, const ObjectLabel&) { throw exception::AlibException("LabelSet has no next Label."); } diff --git a/alib2data/src/label/NextLabel.h b/alib2data/src/label/NextLabel.h index 544a5eb832..dee5b2a7ad 100644 --- a/alib2data/src/label/NextLabel.h +++ b/alib2data/src/label/NextLabel.h @@ -19,6 +19,7 @@ namespace label { */ class NextLabel : public VisitableLabelBase::visitor_type { void Visit(void*, const PrimitiveLabel& label); + void Visit(void*, const HexavigesimalLabel& label); void Visit(void*, const ObjectLabel& label); void Visit(void*, const LabelSetLabel& label); void Visit(void*, const LabelPairLabel& label); diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index 475fd55bf9..3f8e1e127c 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -59,6 +59,7 @@ namespace label { class PrimitiveLabel; class ObjectLabel; +class HexavigesimalLabel; class LabelSetLabel; class LabelPairLabel; @@ -111,7 +112,7 @@ typedef std::acceptor_base< exception::AlibException, automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::DPDA, automaton::SinglePopDPDA, automaton::InputDrivenNPDA, automaton::VisiblyPushdownNPDA, automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM, grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar, - label::PrimitiveLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, + label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, @@ -125,7 +126,7 @@ class ObjectBase : exception::AlibException, automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::DPDA, automaton::SinglePopDPDA, automaton::InputDrivenNPDA, automaton::VisiblyPushdownNPDA, automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM, grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar, - label::PrimitiveLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, + label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, diff --git a/alib2data/src/std/hexavigesimal.cpp b/alib2data/src/std/hexavigesimal.cpp index 8b68bbc4e6..3a750e2621 100644 --- a/alib2data/src/std/hexavigesimal.cpp +++ b/alib2data/src/std/hexavigesimal.cpp @@ -9,16 +9,29 @@ namespace std { -string toBase26( int id ) { +unsigned fromBase26( string rep ) { + // http://en.wikipedia.org/wiki/Hexavigesimal + + unsigned n = 0; + for(char repSymbol : rep ) { + unsigned remainder = repSymbol - 'A'; + if(remainder > 26) + throw 1; //("Invalid argument"); //TODO fix + n = n * 26 + remainder; + } + + return n; +} + +string toBase26( unsigned id ) { // http://en.wikipedia.org/wiki/Hexavigesimal - unsigned int n = id; string name; do { - unsigned int remainder = n % 26; + unsigned remainder = id % 26; name += ( char )( remainder + 'A' ); - n = (n - remainder) / 26; - } while (n > 0); + id = (id - remainder) / 26; + } while (id > 0); return string( name.rbegin( ), name.rend( ) ); } diff --git a/alib2data/src/std/hexavigesimal.h b/alib2data/src/std/hexavigesimal.h index a6812eb1ed..36147c76c0 100644 --- a/alib2data/src/std/hexavigesimal.h +++ b/alib2data/src/std/hexavigesimal.h @@ -15,8 +15,8 @@ namespace std { /** * Maps 1 -> A, 2 -> B, ..., AA, AB, AC, ... , AAA, AAB, ... * http://en.wikipedia.org/wiki/Hexavigesimal - */ -std::string toBase26( int n ); + *///FIXME opravdu to mapuje takhle? +std::string toBase26( unsigned n ); } /* namespace std */ -- GitLab