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