From cf05476f0e211284b3812a911dcbdf4066377f5a Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 20 Oct 2014 14:48:19 +0200 Subject: [PATCH] primitive::Integer in RankedSymbol and fix parsing --- alib2data/src/alphabet/RankedSymbol.cpp | 16 ++++++++-------- alib2data/src/alphabet/RankedSymbol.h | 9 +++++---- alib2data/src/alphabet/SymbolFeatures.h | 4 +++- alib2data/src/alphabet/SymbolFromXMLParser.cpp | 10 ++++++++-- .../src/alphabet/SymbolToStringComposer.cpp | 8 +++++--- alib2data/src/alphabet/SymbolToXMLComposer.cpp | 2 +- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp index a5320a7408..0c300b7f41 100644 --- a/alib2data/src/alphabet/RankedSymbol.cpp +++ b/alib2data/src/alphabet/RankedSymbol.cpp @@ -2,23 +2,23 @@ namespace alphabet { -RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(rank) { +RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(primitive::Integer(rank)) { } -RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(rank) { +RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(primitive::Integer(rank)) { } -RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(rank) { +RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(primitive::Integer(rank)) { } -RankedSymbol::RankedSymbol(const label::Label& label, int rank) : label(label), rank(rank) { +RankedSymbol::RankedSymbol(const label::Label& label, const primitive::Integer& rank) : label(label), rank(rank) { } -RankedSymbol::RankedSymbol(label::Label&& label, int rank) : label(std::move(label)), rank(rank) { +RankedSymbol::RankedSymbol(label::Label&& label, primitive::Integer&& rank) : label(std::move(label)), rank(std::move(rank)) { } @@ -34,7 +34,7 @@ const label::Label& RankedSymbol::getLabel() const { return label; } -int RankedSymbol::getRank() const { +const primitive::Integer& RankedSymbol::getRank() const { return rank; } @@ -61,11 +61,11 @@ bool RankedSymbol::operator <(const RankedSymbol& other) const { } void RankedSymbol::operator>>(std::ostream& out) const { - out << "(RankedSymbol " << this->label << " #" << rank << ")"; + out << "(RankedSymbol " << label << " #" << rank << ")"; } RankedSymbol::operator std::string () const { - return (std::string) label + "_" + std::to_string(rank); + return (std::string) label + "_" + (std::string) rank; } } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h index bda49d7815..c13b2c94ba 100644 --- a/alib2data/src/alphabet/RankedSymbol.h +++ b/alib2data/src/alphabet/RankedSymbol.h @@ -4,6 +4,7 @@ #include "../label/Label.h" #include "SymbolBase.h" #include <ostream> +#include "../primitive/Integer.h" namespace alphabet { @@ -13,7 +14,7 @@ namespace alphabet { class RankedSymbol : public std::acceptor<RankedSymbol, VisitableSymbolBase, std::acceptor<RankedSymbol, alib::VisitableObjectBase, SymbolBase> > { protected: label::Label label; - int rank; + primitive::Integer rank; public: explicit RankedSymbol(int number, int rank); @@ -25,8 +26,8 @@ public: * @param symbol name of the symbol * @param rank of the symbol */ - explicit RankedSymbol(const label::Label& label, int rank); - explicit RankedSymbol(label::Label&& label, int rank); + explicit RankedSymbol(const label::Label& label, const primitive::Integer& rank); + explicit RankedSymbol(label::Label&& label, primitive::Integer&& rank); virtual SymbolBase* clone() const; virtual SymbolBase* plunder() &&; @@ -39,7 +40,7 @@ public: /** * @return rank of the symbol */ - int getRank() const; + const primitive::Integer& getRank() const; virtual bool operator <(const alib::ObjectBase& other) const; virtual bool operator ==(const alib::ObjectBase& other) const; diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h index cce97fbfe6..23d2f2c799 100644 --- a/alib2data/src/alphabet/SymbolFeatures.h +++ b/alib2data/src/alphabet/SymbolFeatures.h @@ -14,7 +14,9 @@ enum class FEATURES { LABELED, BLANK, BOTTOM, - END + END, + RANKED, + BAR }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index a2769e2896..408d7b1002 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp +++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp @@ -15,7 +15,7 @@ namespace alphabet { Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input) const { - return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END})); + return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR})); } Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -31,6 +31,12 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std: } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) { if(!features.count(FEATURES::END)) throw exception::AlibException(); return Symbol(parseEndSymbol(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol")) { + if(!features.count(FEATURES::RANKED)) throw exception::AlibException(); + return Symbol(parseRankedSymbol(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) { + if(!features.count(FEATURES::BAR)) throw exception::AlibException(); + return Symbol(parseBarSymbol(input)); } else { throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); } @@ -72,7 +78,7 @@ EndSymbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) cons RankedSymbol SymbolFromXMLParser::parseRankedSymbol(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol"); label::Label data = alib::api<label::Label>::parse(input); - int rank = std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER)); + primitive::Integer rank = alib::api<primitive::Integer>::parse(input); popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedSymbol"); return RankedSymbol(data, rank); } diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp index 3b365ce9a6..f42d3eb9d4 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.cpp +++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp @@ -7,6 +7,7 @@ #include "SymbolToStringComposer.h" #include "../label/LabelToStringComposer.h" +#include "../primitive/PrimitiveToStringComposer.h" #include <algorithm> #include "LabeledSymbol.h" #include "RankedSymbol.h" @@ -41,9 +42,10 @@ void SymbolToStringComposer::Visit(void* userData, const EndSymbol&) { void SymbolToStringComposer::Visit(void* userData, const RankedSymbol& symbol) { std::stringstream &out = *((std::stringstream*) userData); - label::LabelToStringComposer composer; - out << composer.compose(symbol.getLabel()); - out << std::to_string(symbol.getRank()); + label::LabelToStringComposer composer1; + out << composer1.compose(symbol.getLabel()); + primitive::PrimitiveToStringComposer composer2; + out << composer2.compose(primitive::Primitive(symbol.getRank())); } void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) { diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp index d3a4e07231..263155c543 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp @@ -56,7 +56,7 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const RankedSymbol& symbol) c std::list<sax::Token> out; out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::START_ELEMENT)); out.splice(out.end(), alib::api<label::Label>::compose(symbol.getLabel())); - out.push_back(sax::Token(std::to_string(symbol.getRank()), sax::Token::TokenType::CHARACTER)); + out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getRank())); out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::END_ELEMENT)); return out; } -- GitLab