diff --git a/CBot/src/CBot/CBotToken.cpp b/CBot/src/CBot/CBotToken.cpp index 64a6ccef..af0280a5 100644 --- a/CBot/src/CBot/CBotToken.cpp +++ b/CBot/src/CBot/CBotToken.cpp @@ -21,133 +21,117 @@ #include #include -#include +#include namespace CBot { namespace { - template - boost::bimap makeBimap(std::initializer_list::value_type> list) - { - return boost::bimap(list.begin(), list.end()); - } + static const std::string TX_UNDEF_VALUE = "undefined"; } //! \brief Keeps the string corresponding to keyword ID //! Map is filled with id-string pars that are needed for CBot language parsing -static const boost::bimap KEYWORDS = makeBimap({ - {ID_IF, "if"}, - {ID_ELSE, "else"}, - {ID_WHILE, "while"}, - {ID_DO, "do"}, - {ID_FOR, "for"}, - {ID_BREAK, "break"}, - {ID_CONTINUE, "continue"}, - {ID_SWITCH, "switch"}, - {ID_CASE, "case"}, - {ID_DEFAULT, "default"}, - {ID_TRY, "try"}, - {ID_THROW, "throw"}, - {ID_CATCH, "catch"}, - {ID_FINALLY, "finally"}, - {ID_TXT_AND, "and"}, - {ID_TXT_OR, "or"}, - {ID_TXT_NOT, "not"}, - {ID_RETURN, "return"}, - {ID_CLASS, "class"}, - {ID_EXTENDS, "extends"}, - {ID_SYNCHO, "synchronized"}, - {ID_NEW, "new"}, - {ID_PUBLIC, "public"}, - {ID_EXTERN, "extern"}, - {ID_STATIC, "static"}, - {ID_PROTECTED, "protected"}, - {ID_PRIVATE, "private"}, - {ID_REPEAT, "repeat"}, - {ID_INT, "int"}, - {ID_FLOAT, "float"}, - {ID_BOOLEAN, "boolean"}, - {ID_STRING, "string"}, - {ID_VOID, "void"}, - {ID_BOOL, "bool"}, - {ID_BYTE, "byte"}, - {ID_SHORT, "short"}, - {ID_CHAR, "char"}, - {ID_LONG, "long"}, - {ID_DOUBLE, "double"}, - {ID_TRUE, "true"}, - {ID_FALSE, "false"}, - {ID_NULL, "null"}, - {ID_NAN, "nan"}, - {ID_OPENPAR, "("}, - {ID_CLOSEPAR, ")"}, - {ID_OPBLK, "{"}, - {ID_CLBLK, "}"}, - {ID_SEP, ";"}, - {ID_COMMA, ","}, - {ID_DOTS, ":"}, - {ID_DOT, "."}, - {ID_OPBRK, "["}, - {ID_CLBRK, "]"}, - {ID_DBLDOTS, "::"}, - {ID_LOGIC, "?"}, - {ID_ADD, "+"}, - {ID_SUB, "-"}, - {ID_MUL, "*"}, - {ID_DIV, "/"}, - {ID_ASS, "="}, - {ID_ASSADD, "+="}, - {ID_ASSSUB, "-="}, - {ID_ASSMUL, "*="}, - {ID_ASSDIV, "/="}, - {ID_ASSOR, "|="}, - {ID_ASSAND, "&="}, - {ID_ASSXOR, "^="}, - {ID_ASSSL, "<<="}, - {ID_ASSSR, ">>>="}, - {ID_ASSASR, ">>="}, - {ID_SL, "<<"}, - {ID_SR, ">>>"}, - {ID_ASR, ">>"}, - {ID_INC, "++"}, - {ID_DEC, "--"}, - {ID_LO, "<"}, - {ID_HI, ">"}, - {ID_LS, "<="}, - {ID_HS, ">="}, - {ID_EQ, "=="}, - {ID_NE, "!="}, - {ID_AND, "&"}, - {ID_XOR, "^"}, - {ID_OR, "|"}, - {ID_LOG_AND, "&&"}, - {ID_LOG_OR, "||"}, - {ID_LOG_NOT, "!"}, - {ID_NOT, "~"}, - {ID_MODULO, "%"}, - {ID_POWER, "**"}, - {ID_ASSMODULO, "%="}, - {TX_UNDEF, "undefined"}, - {TX_NAN, "not a number"} -}); +static const std::map KEYWORDS{ + {"if", ID_IF}, + {"else", ID_ELSE}, + {"while", ID_WHILE}, + {"do", ID_DO}, + {"for", ID_FOR}, + {"break", ID_BREAK}, + {"continue", ID_CONTINUE}, + {"switch", ID_SWITCH}, + {"case", ID_CASE}, + {"default", ID_DEFAULT}, + {"try", ID_TRY}, + {"throw", ID_THROW}, + {"catch", ID_CATCH}, + {"finally", ID_FINALLY}, + {"and", ID_TXT_AND}, + {"or", ID_TXT_OR}, + {"not", ID_TXT_NOT}, + {"return", ID_RETURN}, + {"class", ID_CLASS}, + {"extends", ID_EXTENDS}, + {"synchronized", ID_SYNCHO}, + {"new", ID_NEW}, + {"public", ID_PUBLIC}, + {"extern", ID_EXTERN}, + {"static", ID_STATIC}, + {"protected", ID_PROTECTED}, + {"private", ID_PRIVATE}, + {"repeat", ID_REPEAT}, + {"int", ID_INT}, + {"float", ID_FLOAT}, + {"boolean", ID_BOOLEAN}, + {"string", ID_STRING}, + {"void", ID_VOID}, + {"bool", ID_BOOL}, + {"byte", ID_BYTE}, + {"short", ID_SHORT}, + {"char", ID_CHAR}, + {"long", ID_LONG}, + {"double", ID_DOUBLE}, + {"true", ID_TRUE}, + {"false", ID_FALSE}, + {"null", ID_NULL}, + {"nan", ID_NAN}, + {"(", ID_OPENPAR}, + {")", ID_CLOSEPAR}, + {"{", ID_OPBLK}, + {"}", ID_CLBLK}, + {";", ID_SEP}, + {",", ID_COMMA}, + {":", ID_DOTS}, + {".", ID_DOT}, + {"[", ID_OPBRK}, + {"]", ID_CLBRK}, + {"::", ID_DBLDOTS}, + {"?", ID_LOGIC}, + {"+", ID_ADD}, + {"-", ID_SUB}, + {"*", ID_MUL}, + {"/", ID_DIV}, + {"=", ID_ASS}, + {"+=", ID_ASSADD}, + {"-=", ID_ASSSUB}, + {"*=", ID_ASSMUL}, + {"/=", ID_ASSDIV}, + {"|=", ID_ASSOR}, + {"&=", ID_ASSAND}, + {"^=", ID_ASSXOR}, + {"<<=", ID_ASSSL}, + {">>>=", ID_ASSSR}, + {">>=", ID_ASSASR}, + {"<<", ID_SL}, + {">>>", ID_SR}, + {">>", ID_ASR}, + {"++", ID_INC}, + {"--", ID_DEC}, + {"<", ID_LO}, + {">", ID_HI}, + {"<=", ID_LS}, + {">=", ID_HS}, + {"==", ID_EQ}, + {"!=", ID_NE}, + {"&", ID_AND}, + {"^", ID_XOR}, + {"|", ID_OR}, + {"&&", ID_LOG_AND}, + {"||", ID_LOG_OR}, + {"!", ID_LOG_NOT}, + {"~", ID_NOT}, + {"%", ID_MODULO}, + {"**", ID_POWER}, + {"%=", ID_ASSMODULO}, + {TX_UNDEF_VALUE, TX_UNDEF}, + {"not a number", TX_NAN} +}; -namespace +const std::string& UndefinedTokenString() { -static const std::string emptyString = ""; -} -const std::string& LoadString(TokenId id) -{ - auto it = KEYWORDS.left.find(id); - if (it != KEYWORDS.left.end()) - { - return it->second; - } - else - { - return emptyString; - } + return TX_UNDEF_VALUE; } //////////////////////////////////////////////////////////////////////////////// @@ -504,8 +488,8 @@ std::unique_ptr CBotToken::CompileTokens(const std::string& program) //////////////////////////////////////////////////////////////////////////////// int CBotToken::GetKeyWord(const std::string& w) { - auto it = KEYWORDS.right.find(w); - if (it != KEYWORDS.right.end()) + auto it = KEYWORDS.find(w); + if (it != KEYWORDS.end()) { return it->second; } diff --git a/CBot/src/CBot/CBotToken.h b/CBot/src/CBot/CBotToken.h index 66b8df5e..51a9a0c8 100644 --- a/CBot/src/CBot/CBotToken.h +++ b/CBot/src/CBot/CBotToken.h @@ -242,10 +242,13 @@ extern bool IsOfType(CBotToken* &p, int type1, int type2 = -1); extern bool IsOfTypeList(CBotToken* &p, int type1, ...); /** - * \brief Maps given ID to its string equivalent - * \param id Token type identifier - * \return String if found, empty string otherwise + * \brief Return the value associated with TX_UNDEF TokenId + * + * Mapping other TokenIds to its string values was not used and does not seem useful + * so the only supported mapping is TX_UNDEF -> value. + * + * \return String associated with TX_UNDEF TokenId */ -const std::string& LoadString(TokenId id); +const std::string& UndefinedTokenString(); } // namespace CBot diff --git a/CBot/src/CBot/CBotVar/CBotVarChar.h b/CBot/src/CBot/CBotVar/CBotVarChar.h index 2354c9e8..7b2ae7dd 100644 --- a/CBot/src/CBot/CBotVar/CBotVarChar.h +++ b/CBot/src/CBot/CBotVar/CBotVarChar.h @@ -35,7 +35,7 @@ public: std::string GetValString() const override { if (m_binit == CBotVar::InitType::UNDEF) - return LoadString(TX_UNDEF); + return UndefinedTokenString(); if (0x10FFFF < m_val || (0xD7FF < m_val && m_val < 0xE000)) return "\xEF\xBF\xBD"; // replacement character U+FFFD diff --git a/CBot/src/CBot/CBotVar/CBotVarValue.h b/CBot/src/CBot/CBotVar/CBotVarValue.h index dff6a059..1f7e9838 100644 --- a/CBot/src/CBot/CBotVar/CBotVarValue.h +++ b/CBot/src/CBot/CBotVar/CBotVarValue.h @@ -65,7 +65,7 @@ public: std::string GetValString() const override { if (m_binit == CBotVar::InitType::UNDEF) - return LoadString(TX_UNDEF); + return UndefinedTokenString(); std::ostringstream s; s << std::boolalpha << m_val;