Skip to content
Snippets Groups Projects
Commit cf05476f authored by Jan Trávníček's avatar Jan Trávníček
Browse files

primitive::Integer in RankedSymbol and fix parsing

parent 6d18c231
No related branches found
No related tags found
No related merge requests found
......@@ -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 */
......
......@@ -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;
......
......@@ -14,7 +14,9 @@ enum class FEATURES {
LABELED,
BLANK,
BOTTOM,
END
END,
RANKED,
BAR
};
 
} /* namespace alphabet */
......
......@@ -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);
}
......
......@@ -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&) {
......
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment