[colobot] 222/377: Small CBotTwoOpExpr cleanup
Didier Raboud
odyx at moszumanska.debian.org
Wed Mar 30 13:34:19 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit 70555d984c7aa37365b9b3852161c5466275adc5
Author: krzys-h <krzys_h at interia.pl>
Date: Tue Jan 5 13:04:15 2016 +0100
Small CBotTwoOpExpr cleanup
---
src/CBot/CBotClass.h | 2 +-
src/CBot/CBotInstr/CBotTwoOpExpr.cpp | 128 ++++++++++++++++++++---------------
src/CBot/CBotInstr/CBotTwoOpExpr.h | 19 ++++++
src/CBot/CBotTypResult.h | 2 +-
4 files changed, 94 insertions(+), 57 deletions(-)
diff --git a/src/CBot/CBotClass.h b/src/CBot/CBotClass.h
index 56b6902..a826911 100644
--- a/src/CBot/CBotClass.h
+++ b/src/CBot/CBotClass.h
@@ -148,7 +148,7 @@ public:
/*!
* \brief SetUpdateFunc Defines routine to be called to update the elements
* of the class.
- * \param rMaj
+ * \param rUpdate
* \return
*/
bool SetUpdateFunc(void rUpdate(CBotVar* thisVar, void* user));
diff --git a/src/CBot/CBotInstr/CBotTwoOpExpr.cpp b/src/CBot/CBotInstr/CBotTwoOpExpr.cpp
index fb65039..32e90f1 100644
--- a/src/CBot/CBotInstr/CBotTwoOpExpr.cpp
+++ b/src/CBot/CBotInstr/CBotTwoOpExpr.cpp
@@ -49,75 +49,93 @@ CBotTwoOpExpr::~CBotTwoOpExpr()
delete m_rightop;
}
-// type of operands accepted by operations
-#define ENTIER ((1<<CBotTypByte)|(1<<CBotTypShort)|(1<<CBotTypChar)|(1<<CBotTypInt)|(1<<CBotTypLong))
-#define FLOTANT ((1<<CBotTypFloat)|(1<<CBotTypDouble))
-#define BOOLEEN (1<<CBotTypBoolean)
-#define CHAINE (1<<CBotTypString)
+// This list contains all possible operations
+// They are sorted in reversed order of precedence (the ones that get executed first are at the end),
+// the operations have equal precedence until 0 marker
+// The entries are made of pairs: bitmask of acceptable parameters type and operand token
+
+#define INTEGER ((1<<CBotTypByte)|(1<<CBotTypShort)|(1<<CBotTypChar)|(1<<CBotTypInt)|(1<<CBotTypLong))
+#define FLOAT ((1<<CBotTypFloat)|(1<<CBotTypDouble))
+#define BOOLEAN (1<<CBotTypBoolean)
+#define STRING (1<<CBotTypString)
#define POINTER (1<<CBotTypPointer)
#define INSTANCE (1<<CBotTypClass)
-// list of operations (précéance)
-// acceptable type, operand
-// zero ends level \TODO précéance
-
static int ListOp[] =
{
- BOOLEEN, ID_LOGIC, 0,
- BOOLEEN, ID_TXT_OR,
- BOOLEEN, ID_LOG_OR, 0,
- BOOLEEN, ID_TXT_AND,
- BOOLEEN, ID_LOG_AND, 0,
- BOOLEEN|ENTIER, ID_OR, 0,
- BOOLEEN|ENTIER, ID_XOR, 0,
- BOOLEEN|ENTIER, ID_AND, 0,
- BOOLEEN|ENTIER|FLOTANT
- |CHAINE
- |POINTER
- |INSTANCE,ID_EQ,
- BOOLEEN|ENTIER|FLOTANT
- |CHAINE
- |POINTER
- |INSTANCE,ID_NE, 0,
- ENTIER|FLOTANT|CHAINE, ID_HI,
- ENTIER|FLOTANT|CHAINE, ID_LO,
- ENTIER|FLOTANT|CHAINE, ID_HS,
- ENTIER|FLOTANT|CHAINE, ID_LS, 0,
- ENTIER, ID_SR,
- ENTIER, ID_SL,
- ENTIER, ID_ASR, 0,
- ENTIER|FLOTANT|CHAINE, ID_ADD,
- ENTIER|FLOTANT, ID_SUB, 0,
- ENTIER|FLOTANT, ID_MUL,
- ENTIER|FLOTANT, ID_DIV,
- ENTIER|FLOTANT, ID_MODULO, 0,
- ENTIER|FLOTANT, ID_POWER, 0,
+ BOOLEAN, ID_LOGIC,
+ 0,
+
+ BOOLEAN, ID_TXT_OR,
+ BOOLEAN, ID_LOG_OR,
+ 0,
+
+ BOOLEAN, ID_TXT_AND,
+ BOOLEAN, ID_LOG_AND,
+ 0,
+
+ BOOLEAN | INTEGER, ID_OR,
+ 0,
+
+ BOOLEAN | INTEGER, ID_XOR,
+ 0,
+
+ BOOLEAN | INTEGER, ID_AND,
+ 0,
+
+ BOOLEAN | INTEGER | FLOAT | STRING | POINTER | INSTANCE, ID_EQ,
+ BOOLEAN | INTEGER | FLOAT | STRING | POINTER | INSTANCE, ID_NE,
+ 0,
+
+ INTEGER | FLOAT | STRING, ID_HI,
+ INTEGER | FLOAT | STRING, ID_LO,
+ INTEGER | FLOAT | STRING, ID_HS,
+ INTEGER | FLOAT | STRING, ID_LS,
+ 0,
+
+ INTEGER, ID_SR,
+ INTEGER, ID_SL,
+ INTEGER, ID_ASR,
+ 0,
+
+ INTEGER | FLOAT | STRING, ID_ADD,
+ INTEGER | FLOAT, ID_SUB,
+ 0,
+
+ INTEGER | FLOAT, ID_MUL,
+ INTEGER | FLOAT, ID_DIV,
+ INTEGER | FLOAT, ID_MODULO,
0,
+
+ INTEGER | FLOAT, ID_POWER,
+ 0,
+
+ 0, // end of list
};
-bool IsInList( int val, int* list, int& typemasque )
+bool IsInList(int val, int* list, int& typeMask)
{
while (true)
{
if ( *list == 0 ) return false;
- typemasque = *list++;
+ typeMask = *list++;
if ( *list++ == val ) return true;
}
}
-bool TypeOk( int type, int test )
+bool TypeOk(int type, int test)
{
while (true)
{
- if ( type == 0 ) return (test & 1);
- type--; test /= 2;
+ if ( type == 0 ) return (test & 1) != 0;
+ type--; test >>= 1;
}
}
////////////////////////////////////////////////////////////////////////////////
CBotInstr* CBotTwoOpExpr::Compile(CBotToken* &p, CBotCStack* pStack, int* pOperations)
{
- int typemasque;
+ int typeMask;
if ( pOperations == nullptr ) pOperations = ListOp;
int* pOp = pOperations;
@@ -133,13 +151,13 @@ CBotInstr* CBotTwoOpExpr::Compile(CBotToken* &p, CBotCStack* pStack, int* pOpera
if (left == nullptr) return pStack->Return(nullptr, pStk); // if error, transmit
// did we expected the operand?
- int TypeOp = p->GetType();
- if ( IsInList( TypeOp, pOperations, typemasque ) )
+ int typeOp = p->GetType();
+ if ( IsInList(typeOp, pOperations, typeMask) )
{
CBotTypResult type1, type2;
type1 = pStk->GetTypResult(); // what kind of the first operand?
- if ( TypeOp == ID_LOGIC ) // special case provided for: ? op1: op2;
+ if (typeOp == ID_LOGIC) // special case provided for: ? op1: op2;
{
if ( !type1.Eq(CBotTypBoolean) )
{
@@ -197,19 +215,19 @@ CBotInstr* CBotTwoOpExpr::Compile(CBotToken* &p, CBotCStack* pStack, int* pOpera
// what kind of result?
int TypeRes = std::max( type1.GetType(CBotTypResult::GetTypeMode::NULL_AS_POINTER), type2.GetType(CBotTypResult::GetTypeMode::NULL_AS_POINTER) );
- if ( TypeOp == ID_ADD && type1.Eq(CBotTypString) )
+ if (typeOp == ID_ADD && type1.Eq(CBotTypString))
{
TypeRes = CBotTypString;
type2 = type1; // any type convertible chain
}
- else if ( TypeOp == ID_ADD && type2.Eq(CBotTypString) )
+ else if (typeOp == ID_ADD && type2.Eq(CBotTypString))
{
TypeRes = CBotTypString;
type1 = type2; // any type convertible chain
}
- else if (!TypeOk( TypeRes, typemasque )) type1.SetType(99);// error of type
+ else if (!TypeOk(TypeRes, typeMask)) type1.SetType(99);// error of type
- switch ( TypeOp )
+ switch (typeOp)
{
case ID_LOG_OR:
case ID_LOG_AND:
@@ -223,15 +241,15 @@ CBotInstr* CBotTwoOpExpr::Compile(CBotToken* &p, CBotCStack* pStack, int* pOpera
case ID_LS:
TypeRes = CBotTypBoolean;
}
- if ( TypeCompatible (type1, type2, TypeOp ) ) // the results are compatible
+ if ( TypeCompatible (type1, type2, typeOp) ) // the results are compatible
{
// ok so, saves the operand in the object
inst->m_leftop = left;
// special for evaluation of the operations of the same level from left to right
- while ( IsInList( p->GetType(), pOperations, typemasque ) ) // same operation(s) follows?
+ while ( IsInList(p->GetType(), pOperations, typeMask) ) // same operation(s) follows?
{
- TypeOp = p->GetType();
+ typeOp = p->GetType();
CBotTwoOpExpr* i = new CBotTwoOpExpr(); // element for operation
i->SetToken(p); // stores the operation
i->m_leftop = inst; // left operand
@@ -241,7 +259,7 @@ CBotInstr* CBotTwoOpExpr::Compile(CBotToken* &p, CBotCStack* pStack, int* pOpera
i->m_rightop = CBotTwoOpExpr::Compile( p, pStk, pOp );
type2 = pStk->GetTypResult();
- if ( !TypeCompatible (type1, type2, TypeOp) ) // the results are compatible
+ if ( !TypeCompatible (type1, type2, typeOp) ) // the results are compatible
{
pStk->SetError(CBotErrBadType2, &i->m_token);
delete i;
diff --git a/src/CBot/CBotInstr/CBotTwoOpExpr.h b/src/CBot/CBotInstr/CBotTwoOpExpr.h
index ea33ee3..b137514 100644
--- a/src/CBot/CBotInstr/CBotTwoOpExpr.h
+++ b/src/CBot/CBotInstr/CBotTwoOpExpr.h
@@ -32,6 +32,25 @@ namespace CBot
* op1 + op2
* op1 > op2
* \endcode
+ *
+ * \section Operations Supported operations
+ *
+ * This table is sorted by operator precedence
+ *
+ * | Operator |
+ * | -------------------------------------- |
+ * | ** |
+ * | *, /, % |
+ * | +, - |
+ * | <<, >>, >>> |
+ * | >, <, >=, <= |
+ * | ==, != |
+ * | & |
+ * | ^ |
+ * | \| |
+ * | &&, and |
+ * | \|\|, or |
+ * | a ? b : c (special, see CBotLogicExpr) |
*/
class CBotTwoOpExpr : public CBotInstr
{
diff --git a/src/CBot/CBotTypResult.h b/src/CBot/CBotTypResult.h
index 8033423..edadc55 100644
--- a/src/CBot/CBotTypResult.h
+++ b/src/CBot/CBotTypResult.h
@@ -96,7 +96,7 @@ public:
~CBotTypResult();
/**
- * \brief Mode for GetType() and GetTypResult()
+ * \brief Mode for GetType()
*/
enum class GetTypeMode
{
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list