parent
f9714c35f7
commit
beb29333d5
|
@ -21,133 +21,117 @@
|
|||
|
||||
#include <cstdarg>
|
||||
#include <cassert>
|
||||
#include <boost/bimap.hpp>
|
||||
#include <map>
|
||||
|
||||
namespace CBot
|
||||
{
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename L, typename R>
|
||||
boost::bimap<L, R> makeBimap(std::initializer_list<typename boost::bimap<L, R>::value_type> list)
|
||||
{
|
||||
return boost::bimap<L, R>(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<TokenId, std::string> KEYWORDS = makeBimap<TokenId, std::string>({
|
||||
{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<std::string, TokenId> 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> 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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue