From ef4e2f08a36d5eb5e9ece4b03a758b133e27ae8b Mon Sep 17 00:00:00 2001 From: Grunaka Date: Mon, 16 Nov 2015 22:00:01 +0100 Subject: [PATCH] Moving CBotInstr class in its own header and source files. --- src/CBot/CBot.cpp | 336 --------------------- src/CBot/CBot.h | 90 ------ src/CBot/CBotDefines.h | 2 + src/CBot/CBotInstr/CBotBlock.h | 2 + src/CBot/CBotInstr/CBotBoolExpr.h | 2 + src/CBot/CBotInstr/CBotBoolean.h | 2 + src/CBot/CBotInstr/CBotBreak.h | 2 + src/CBot/CBotInstr/CBotCase.h | 2 + src/CBot/CBotInstr/CBotCatch.h | 2 + src/CBot/CBotInstr/CBotClassInst.h | 2 + src/CBot/CBotInstr/CBotCondition.h | 2 + src/CBot/CBotInstr/CBotDo.h | 2 + src/CBot/CBotInstr/CBotEmpty.h | 2 + src/CBot/CBotInstr/CBotExprAlpha.h | 2 + src/CBot/CBotInstr/CBotExprBool.h | 2 + src/CBot/CBotInstr/CBotExprNan.h | 2 + src/CBot/CBotInstr/CBotExprNull.h | 2 + src/CBot/CBotInstr/CBotExprNum.h | 2 + src/CBot/CBotInstr/CBotExprUnaire.h | 2 + src/CBot/CBotInstr/CBotExprVar.h | 2 + src/CBot/CBotInstr/CBotExpression.h | 3 + src/CBot/CBotInstr/CBotFieldExpr.h | 2 + src/CBot/CBotInstr/CBotFloat.h | 2 + src/CBot/CBotInstr/CBotFor.h | 2 + src/CBot/CBotInstr/CBotFunction.h | 2 + src/CBot/CBotInstr/CBotIString.h | 2 + src/CBot/CBotInstr/CBotIf.h | 2 + src/CBot/CBotInstr/CBotIndexExpr.h | 2 + src/CBot/CBotInstr/CBotInstArray.h | 2 + src/CBot/CBotInstr/CBotInstr.cpp | 374 ++++++++++++++++++++++++ src/CBot/CBotInstr/CBotInstr.h | 266 +++++++++++++++++ src/CBot/CBotInstr/CBotInstrCall.h | 2 + src/CBot/CBotInstr/CBotInstrMethode.h | 2 + src/CBot/CBotInstr/CBotInt.h | 2 + src/CBot/CBotInstr/CBotLeftExpr.h | 2 + src/CBot/CBotInstr/CBotLeftExprVar.h | 2 + src/CBot/CBotInstr/CBotListArray.h | 2 + src/CBot/CBotInstr/CBotListExpression.h | 2 + src/CBot/CBotInstr/CBotListInstr.h | 2 + src/CBot/CBotInstr/CBotLogicExpr.h | 2 + src/CBot/CBotInstr/CBotNew.h | 2 + src/CBot/CBotInstr/CBotParExpr.h | 2 +- src/CBot/CBotInstr/CBotPostIncExpr.h | 2 + src/CBot/CBotInstr/CBotPreIncExpr.h | 2 + src/CBot/CBotInstr/CBotReturn.h | 2 + src/CBot/CBotInstr/CBotSwitch.h | 2 + src/CBot/CBotInstr/CBotThrow.h | 2 + src/CBot/CBotInstr/CBotTry.h | 2 + src/CBot/CBotInstr/CBotTwoOpExpr.h | 2 + src/CBot/CBotInstr/CBotWhile.h | 2 + src/CBot/CBotVar/CBotVarClass.cpp | 4 +- src/CBot/CMakeLists.txt | 1 + 52 files changed, 735 insertions(+), 429 deletions(-) create mode 100644 src/CBot/CBotInstr/CBotInstr.cpp create mode 100644 src/CBot/CBotInstr/CBotInstr.h diff --git a/src/CBot/CBot.cpp b/src/CBot/CBot.cpp index 1c8b4379..1822df7b 100644 --- a/src/CBot/CBot.cpp +++ b/src/CBot/CBot.cpp @@ -83,342 +83,6 @@ // Global include #include - -CBotInstr::CBotInstr() -{ - name = "CBotInstr"; - m_next = nullptr; - m_next2b = nullptr; - m_next3 = nullptr; - m_next3b = nullptr; -} - -CBotInstr::~CBotInstr() -{ - delete m_next; - delete m_next2b; - delete m_next3; - delete m_next3b; -} - -// counter of nested loops, -// to determine the break and continue valid -// list of labels used - - -int CBotInstr::m_LoopLvl = 0; -CBotStringArray CBotInstr::m_labelLvl = CBotStringArray(); - -// adds a level with a label -void CBotInstr::IncLvl(CBotString& label) -{ - m_labelLvl.SetSize(m_LoopLvl+1); - m_labelLvl[m_LoopLvl] = label; - m_LoopLvl++; -} - -// adds a level (switch statement) -void CBotInstr::IncLvl() -{ - m_labelLvl.SetSize(m_LoopLvl+1); - m_labelLvl[m_LoopLvl] = "#SWITCH"; - m_LoopLvl++; -} - -// free a level -void CBotInstr::DecLvl() -{ - m_LoopLvl--; - m_labelLvl[m_LoopLvl].Empty(); -} - -// control validity of break and continue -bool CBotInstr::ChkLvl(const CBotString& label, int type) -{ - int i = m_LoopLvl; - while (--i>=0) - { - if ( type == ID_CONTINUE && m_labelLvl[i] == "#SWITCH") continue; - if (label.IsEmpty()) return true; - if (m_labelLvl[i] == label) return true; - } - return false; -} - -bool CBotInstr::IsOfClass(CBotString n) -{ - return name == n; -} - - -//////////////////////////////////////////////////////////////////////////// -// database management class CBotInstr - -// set the token corresponding to the instruction - -void CBotInstr::SetToken(CBotToken* p) -{ - m_token = *p; -} - -// return the type of the token assicated with the instruction - -int CBotInstr::GetTokenType() -{ - return m_token.GetType(); -} - -// return associated token - -CBotToken* CBotInstr::GetToken() -{ - return &m_token; -} - -// adds the statement following the other - -void CBotInstr::AddNext(CBotInstr* n) -{ - CBotInstr* p = this; - while (p->m_next != nullptr) p = p->m_next; - p->m_next = n; -} - -void CBotInstr::AddNext3(CBotInstr* n) -{ - CBotInstr* p = this; - while (p->m_next3 != nullptr) p = p->m_next3; - p->m_next3 = n; -} - -void CBotInstr::AddNext3b(CBotInstr* n) -{ - CBotInstr* p = this; - while (p->m_next3b != nullptr) p = p->m_next3b; - p->m_next3b = n; -} - -// returns next statement - -CBotInstr* CBotInstr::GetNext() -{ - return m_next; -} - -CBotInstr* CBotInstr::GetNext3() -{ - return m_next3; -} - -CBotInstr* CBotInstr::GetNext3b() -{ - return m_next3b; -} - -/////////////////////////////////////////////////////////////////////////// -// compile an instruction which can be -// while, do, try, throw, if, for, switch, break, continue, return -// int, float, boolean, string, -// declaration of an instance of a class -// arbitrary expression - - -CBotInstr* CBotInstr::Compile(CBotToken* &p, CBotCStack* pStack) -{ - CBotToken* pp = p; - - if (p == nullptr) return nullptr; - - int type = p->GetType(); // what is the next token - - // is it a lable? - if (IsOfType(pp, TokenTypVar) && - IsOfType(pp, ID_DOTS)) - { - type = pp->GetType(); - // these instructions accept only lable - if (!IsOfTypeList(pp, ID_WHILE, ID_FOR, ID_DO, 0)) - { - pStack->SetError(TX_LABEL, pp->GetStart()); - return nullptr; - } - } - - // call routine corresponding to the compilation token found - switch (type) - { - case ID_WHILE: - return CBotWhile::Compile(p, pStack); - - case ID_FOR: - return CBotFor::Compile(p, pStack); - - case ID_DO: - return CBotDo::Compile(p, pStack); - - case ID_BREAK: - case ID_CONTINUE: - return CBotBreak::Compile(p, pStack); - - case ID_SWITCH: - return CBotSwitch::Compile(p, pStack); - - case ID_TRY: - return CBotTry::Compile(p, pStack); - - case ID_THROW: - return CBotThrow::Compile(p, pStack); - - case ID_INT: - return CBotInt::Compile(p, pStack); - - case ID_FLOAT: - return CBotFloat::Compile(p, pStack); - - case ID_STRING: - return CBotIString::Compile(p, pStack); - - case ID_BOOLEAN: - case ID_BOOL: - return CBotBoolean::Compile(p, pStack); - - case ID_IF: - return CBotIf::Compile(p, pStack); - - case ID_RETURN: - return CBotReturn::Compile(p, pStack); - - case ID_ELSE: - pStack->SetStartError(p->GetStart()); - pStack->SetError(TX_ELSEWITHOUTIF, p->GetEnd()); - return nullptr; - - case ID_CASE: - pStack->SetStartError(p->GetStart()); - pStack->SetError(TX_OUTCASE, p->GetEnd()); - return nullptr; - } - - pStack->SetStartError(p->GetStart()); - - // should not be a reserved word DefineNum - if (p->GetType() == TokenTypDef) - { - pStack->SetError(TX_RESERVED, p); - return nullptr; - } - - // this might be an instance of class definnition - CBotToken* ppp = p; - if (IsOfType(ppp, TokenTypVar)) - { - if (CBotClass::Find(p) != nullptr) - { - // yes, compiles the declaration of the instance - return CBotClassInst::Compile(p, pStack); - } - } - - // this can be an arythmetic instruction - CBotInstr* inst = CBotExpression::Compile(p, pStack); - if (IsOfType(p, ID_SEP)) - { - return inst; - } - pStack->SetError(TX_ENDOF, p->GetStart()); - delete inst; - return nullptr; -} - -bool CBotInstr::Execute(CBotStack* &pj) -{ - CBotString ClassManquante = name; - assert(0); // should never go through this routine - // but use the routines of the subclasses - return false; -} - -bool CBotInstr::Execute(CBotStack* &pj, CBotVar* pVar) -{ - if (!Execute(pj)) return false; - pVar->SetVal(pj->GetVar()); - return true; -} - -void CBotInstr::RestoreState(CBotStack* &pj, bool bMain) -{ - CBotString ClassManquante = name; - assert(0); // should never go through this routine - // but use the routines of the subclasses -} - - -bool CBotInstr::ExecuteVar(CBotVar* &pVar, CBotCStack* &pile) -{ - assert(0); // dad do not know, see the girls - return false; -} - -bool CBotInstr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prevToken, bool bStep, bool bExtend) -{ - assert(0); // dad do not know, see the girls - return false; -} - -void CBotInstr::RestoreStateVar(CBotStack* &pile, bool bMain) -{ - assert(0); // dad do not know, see the girls -} - -// this routine is defined only for the subclass CBotCase -// this allows to make the call on all instructions CompCase -// to see if it's a case to the desired value. - -bool CBotInstr::CompCase(CBotStack* &pj, int val) -{ - return false; -} - -CBotInstr* CBotInstr::CompileArray(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool first) -{ - if (IsOfType(p, ID_OPBRK)) - { - if (!IsOfType(p, ID_CLBRK)) - { - pStack->SetError(TX_CLBRK, p->GetStart()); - return nullptr; - } - - CBotInstr* inst = CompileArray(p, pStack, CBotTypResult(CBotTypArrayPointer, type), false); - if (inst != nullptr || !pStack->IsOk()) return inst; - } - - // compiles an array declaration - if (first) return nullptr ; - - CBotInstr* inst = CBotInstArray::Compile(p, pStack, type); - if (inst == nullptr) return nullptr; - - if (IsOfType(p, ID_COMMA)) // several definitions - { - if (nullptr != ( inst->m_next2b = CBotInstArray::CompileArray(p, pStack, type, false))) // compiles next one - { - return inst; - } - delete inst; - return nullptr; - } - - if (IsOfType(p, ID_SEP)) // end of instruction - { - return inst; - } - - delete inst; - pStack->SetError(TX_ENDOF, p->GetStart()); - return nullptr; -} - ////////////////////////////////////////////////////////////////////////////////////////// // compile a list of parameters diff --git a/src/CBot/CBot.h b/src/CBot/CBot.h index e42d1851..71c2279c 100644 --- a/src/CBot/CBot.h +++ b/src/CBot/CBot.h @@ -54,96 +54,6 @@ class CBotDefParam; // paramerer list of a function extern bool SaveVar(FILE* pf, CBotVar* pVar); - -///////////////////////////////////////////////////////////////////// -// class defining an instruction -class CBotInstr -{ -private: - static - CBotStringArray - m_labelLvl; -protected: - CBotToken m_token; // keeps the token - CBotString name; // debug - CBotInstr* m_next; // linked command - CBotInstr* m_next2b; // second list definition chain - CBotInstr* m_next3; // third list for indices and fields - CBotInstr* m_next3b; // necessary for reporting tables -/* - for example, the following program - int x[]; x[1] = 4; - int y[x[1]][10], z; - is generated - CBotInstrArray - m_next3b-> CBotEmpty - m_next-> - CBotExpression .... - m_next-> - CBotInstrArray - m_next3b-> CBotExpression ('x') ( m_next3-> CBotIndexExpr ('1') ) - m_next3b-> CBotExpression ('10') - m_next2-> 'z' - m_next->... - -*/ - - static - int m_LoopLvl; - friend class CBotClassInst; - friend class CBotInt; - friend class CBotListArray; - -public: - CBotInstr(); - virtual - ~CBotInstr(); - - static - CBotInstr* Compile(CBotToken* &p, CBotCStack* pStack); - static - CBotInstr* CompileArray(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool first = true); - - virtual - bool Execute(CBotStack* &pj); - virtual - bool Execute(CBotStack* &pj, CBotVar* pVar); - virtual - void RestoreState(CBotStack* &pj, bool bMain); - - virtual - bool ExecuteVar(CBotVar* &pVar, CBotCStack* &pile); - virtual - bool ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prevToken, bool bStep, bool bExtend); - virtual - void RestoreStateVar(CBotStack* &pile, bool bMain); - - virtual - bool CompCase(CBotStack* &pj, int val); - - void SetToken(CBotToken* p); - int GetTokenType(); - CBotToken* GetToken(); - - void AddNext(CBotInstr* n); - CBotInstr* GetNext(); - void AddNext3(CBotInstr* n); - CBotInstr* GetNext3(); - void AddNext3b(CBotInstr* n); - CBotInstr* GetNext3b(); - - static - void IncLvl(CBotString& label); - static - void IncLvl(); - static - void DecLvl(); - static - bool ChkLvl(const CBotString& label, int type); - - bool IsOfClass(CBotString name); -}; - #define MAX(a,b) ((a>b) ? a : b) extern CBotInstr* CompileParams(CBotToken* &p, CBotCStack* pStack, CBotVar** ppVars); diff --git a/src/CBot/CBotDefines.h b/src/CBot/CBotDefines.h index d09e3ca2..ae72dbbb 100644 --- a/src/CBot/CBotDefines.h +++ b/src/CBot/CBotDefines.h @@ -21,6 +21,8 @@ // Modules inlcude +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotBlock.h b/src/CBot/CBotInstr/CBotBlock.h index f413e756..6c7c6334 100644 --- a/src/CBot/CBotInstr/CBotBlock.h +++ b/src/CBot/CBotInstr/CBotBlock.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotBoolExpr.h b/src/CBot/CBotInstr/CBotBoolExpr.h index df7354ee..e50d8a63 100644 --- a/src/CBot/CBotInstr/CBotBoolExpr.h +++ b/src/CBot/CBotInstr/CBotBoolExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotBoolean.h b/src/CBot/CBotInstr/CBotBoolean.h index 57674200..217daadc 100644 --- a/src/CBot/CBotInstr/CBotBoolean.h +++ b/src/CBot/CBotInstr/CBotBoolean.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotBreak.h b/src/CBot/CBotInstr/CBotBreak.h index 0ad39408..ae35a70f 100644 --- a/src/CBot/CBotInstr/CBotBreak.h +++ b/src/CBot/CBotInstr/CBotBreak.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotCase.h b/src/CBot/CBotInstr/CBotCase.h index 9ba1b86f..e5043330 100644 --- a/src/CBot/CBotInstr/CBotCase.h +++ b/src/CBot/CBotInstr/CBotCase.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotCatch.h b/src/CBot/CBotInstr/CBotCatch.h index 9756c8b8..d4450ec1 100644 --- a/src/CBot/CBotInstr/CBotCatch.h +++ b/src/CBot/CBotInstr/CBotCatch.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotClassInst.h b/src/CBot/CBotInstr/CBotClassInst.h index 370a46cd..3ee791f0 100644 --- a/src/CBot/CBotInstr/CBotClassInst.h +++ b/src/CBot/CBotInstr/CBotClassInst.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotCondition.h b/src/CBot/CBotInstr/CBotCondition.h index 08996db1..3958cadb 100644 --- a/src/CBot/CBotInstr/CBotCondition.h +++ b/src/CBot/CBotInstr/CBotCondition.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotDo.h b/src/CBot/CBotInstr/CBotDo.h index 670a0701..11fe40f4 100644 --- a/src/CBot/CBotInstr/CBotDo.h +++ b/src/CBot/CBotInstr/CBotDo.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotEmpty.h b/src/CBot/CBotInstr/CBotEmpty.h index 04f9fafd..dc50b49b 100644 --- a/src/CBot/CBotInstr/CBotEmpty.h +++ b/src/CBot/CBotInstr/CBotEmpty.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprAlpha.h b/src/CBot/CBotInstr/CBotExprAlpha.h index 3f820607..3cadc322 100644 --- a/src/CBot/CBotInstr/CBotExprAlpha.h +++ b/src/CBot/CBotInstr/CBotExprAlpha.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprBool.h b/src/CBot/CBotInstr/CBotExprBool.h index a2609e26..90f53daa 100644 --- a/src/CBot/CBotInstr/CBotExprBool.h +++ b/src/CBot/CBotInstr/CBotExprBool.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprNan.h b/src/CBot/CBotInstr/CBotExprNan.h index 0d6bbf6f..1f0d58d8 100644 --- a/src/CBot/CBotInstr/CBotExprNan.h +++ b/src/CBot/CBotInstr/CBotExprNan.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprNull.h b/src/CBot/CBotInstr/CBotExprNull.h index 187cb261..90b3f89a 100644 --- a/src/CBot/CBotInstr/CBotExprNull.h +++ b/src/CBot/CBotInstr/CBotExprNull.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprNum.h b/src/CBot/CBotInstr/CBotExprNum.h index dc213319..07fca7e9 100644 --- a/src/CBot/CBotInstr/CBotExprNum.h +++ b/src/CBot/CBotInstr/CBotExprNum.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprUnaire.h b/src/CBot/CBotInstr/CBotExprUnaire.h index 25d21251..75b30a94 100644 --- a/src/CBot/CBotInstr/CBotExprUnaire.h +++ b/src/CBot/CBotInstr/CBotExprUnaire.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExprVar.h b/src/CBot/CBotInstr/CBotExprVar.h index a4535659..638cf8fe 100644 --- a/src/CBot/CBotInstr/CBotExprVar.h +++ b/src/CBot/CBotInstr/CBotExprVar.h @@ -24,6 +24,8 @@ #include "CBotDefines.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotExpression.h b/src/CBot/CBotInstr/CBotExpression.h index d25fd39c..ddf2e257 100644 --- a/src/CBot/CBotInstr/CBotExpression.h +++ b/src/CBot/CBotInstr/CBotExpression.h @@ -21,8 +21,11 @@ // Modules inlcude #include "CBot.h" + #include "CBotLeftExpr.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotFieldExpr.h b/src/CBot/CBotInstr/CBotFieldExpr.h index 13f9fc37..41e828bd 100644 --- a/src/CBot/CBotInstr/CBotFieldExpr.h +++ b/src/CBot/CBotInstr/CBotFieldExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotFloat.h b/src/CBot/CBotInstr/CBotFloat.h index 6223071c..309697b0 100644 --- a/src/CBot/CBotInstr/CBotFloat.h +++ b/src/CBot/CBotInstr/CBotFloat.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotFor.h b/src/CBot/CBotInstr/CBotFor.h index 01edc666..d7d4256d 100644 --- a/src/CBot/CBotInstr/CBotFor.h +++ b/src/CBot/CBotInstr/CBotFor.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotFunction.h b/src/CBot/CBotInstr/CBotFunction.h index 486ffff8..f1fc3c8d 100644 --- a/src/CBot/CBotInstr/CBotFunction.h +++ b/src/CBot/CBotInstr/CBotFunction.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotIString.h b/src/CBot/CBotInstr/CBotIString.h index 1d91ea26..2ea8e4ee 100644 --- a/src/CBot/CBotInstr/CBotIString.h +++ b/src/CBot/CBotInstr/CBotIString.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotIf.h b/src/CBot/CBotInstr/CBotIf.h index 6ea6ee9c..e39e5226 100644 --- a/src/CBot/CBotInstr/CBotIf.h +++ b/src/CBot/CBotInstr/CBotIf.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotIndexExpr.h b/src/CBot/CBotInstr/CBotIndexExpr.h index 730a4de4..a8e7e07a 100644 --- a/src/CBot/CBotInstr/CBotIndexExpr.h +++ b/src/CBot/CBotInstr/CBotIndexExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotInstArray.h b/src/CBot/CBotInstr/CBotInstArray.h index ca2cbe07..4ad025d6 100644 --- a/src/CBot/CBotInstr/CBotInstArray.h +++ b/src/CBot/CBotInstr/CBotInstArray.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotInstr.cpp b/src/CBot/CBotInstr/CBotInstr.cpp new file mode 100644 index 00000000..7d376f7c --- /dev/null +++ b/src/CBot/CBotInstr/CBotInstr.cpp @@ -0,0 +1,374 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsitec.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ + +// Modules inlcude +#include "CBotInstr.h" + +#include "CBotInstr/CBotFor.h" +#include "CBotInstr/CBotDo.h" +#include "CBotInstr/CBotBreak.h" +#include "CBotInstr/CBotSwitch.h" +#include "CBotInstr/CBotTry.h" +#include "CBotInstr/CBotThrow.h" +#include "CBotInstr/CBotInt.h" +#include "CBotInstr/CBotFloat.h" +#include "CBotInstr/CBotWhile.h" +#include "CBotInstr/CBotIString.h" +#include "CBotInstr/CBotBoolean.h" +#include "CBotInstr/CBotIf.h" +#include "CBotInstr/CBotReturn.h" +#include "CBotInstr/CBotClassInst.h" +#include "CBotInstr/CBotExpression.h" +#include "CBotInstr/CBotInstArray.h" + +#include "CBotVar/CBotVar.h" + +#include "CBotClass.h" +#include "CBotStack.h" + + +// Local include + +// Global include +#include + +//////////////////////////////////////////////////////////////////////////////// +int CBotInstr::m_LoopLvl = 0; +CBotStringArray CBotInstr::m_labelLvl = CBotStringArray(); + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr::CBotInstr() +{ + name = "CBotInstr"; + m_next = nullptr; + m_next2b = nullptr; + m_next3 = nullptr; + m_next3b = nullptr; +} + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr::~CBotInstr() +{ + delete m_next; + delete m_next2b; + delete m_next3; + delete m_next3b; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::IncLvl(CBotString& label) +{ + m_labelLvl.SetSize(m_LoopLvl+1); + m_labelLvl[m_LoopLvl] = label; + m_LoopLvl++; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::IncLvl() +{ + m_labelLvl.SetSize(m_LoopLvl+1); + m_labelLvl[m_LoopLvl] = "#SWITCH"; + m_LoopLvl++; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::DecLvl() +{ + m_LoopLvl--; + m_labelLvl[m_LoopLvl].Empty(); +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::ChkLvl(const CBotString& label, int type) +{ + int i = m_LoopLvl; + while (--i>=0) + { + if ( type == ID_CONTINUE && m_labelLvl[i] == "#SWITCH") continue; + if (label.IsEmpty()) return true; + if (m_labelLvl[i] == label) return true; + } + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::IsOfClass(CBotString n) +{ + return name == n; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::SetToken(CBotToken* p) +{ + m_token = *p; +} + +//////////////////////////////////////////////////////////////////////////////// +int CBotInstr::GetTokenType() +{ + return m_token.GetType(); +} + +//////////////////////////////////////////////////////////////////////////////// +CBotToken* CBotInstr::GetToken() +{ + return &m_token; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::AddNext(CBotInstr* n) +{ + CBotInstr* p = this; + while (p->m_next != nullptr) p = p->m_next; + p->m_next = n; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::AddNext3(CBotInstr* n) +{ + CBotInstr* p = this; + while (p->m_next3 != nullptr) p = p->m_next3; + p->m_next3 = n; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::AddNext3b(CBotInstr* n) +{ + CBotInstr* p = this; + while (p->m_next3b != nullptr) p = p->m_next3b; + p->m_next3b = n; +} + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr* CBotInstr::GetNext() +{ + return m_next; +} + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr* CBotInstr::GetNext3() +{ + return m_next3; +} + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr* CBotInstr::GetNext3b() +{ + return m_next3b; +} + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr* CBotInstr::Compile(CBotToken* &p, CBotCStack* pStack) +{ + CBotToken* pp = p; + + if (p == nullptr) return nullptr; + + int type = p->GetType(); // what is the next token + + // is it a lable? + if (IsOfType(pp, TokenTypVar) && + IsOfType(pp, ID_DOTS)) + { + type = pp->GetType(); + // these instructions accept only lable + if (!IsOfTypeList(pp, ID_WHILE, ID_FOR, ID_DO, 0)) + { + pStack->SetError(TX_LABEL, pp->GetStart()); + return nullptr; + } + } + + // call routine corresponding to the compilation token found + switch (type) + { + case ID_WHILE: + return CBotWhile::Compile(p, pStack); + + case ID_FOR: + return CBotFor::Compile(p, pStack); + + case ID_DO: + return CBotDo::Compile(p, pStack); + + case ID_BREAK: + case ID_CONTINUE: + return CBotBreak::Compile(p, pStack); + + case ID_SWITCH: + return CBotSwitch::Compile(p, pStack); + + case ID_TRY: + return CBotTry::Compile(p, pStack); + + case ID_THROW: + return CBotThrow::Compile(p, pStack); + + case ID_INT: + return CBotInt::Compile(p, pStack); + + case ID_FLOAT: + return CBotFloat::Compile(p, pStack); + + case ID_STRING: + return CBotIString::Compile(p, pStack); + + case ID_BOOLEAN: + case ID_BOOL: + return CBotBoolean::Compile(p, pStack); + + case ID_IF: + return CBotIf::Compile(p, pStack); + + case ID_RETURN: + return CBotReturn::Compile(p, pStack); + + case ID_ELSE: + pStack->SetStartError(p->GetStart()); + pStack->SetError(TX_ELSEWITHOUTIF, p->GetEnd()); + return nullptr; + + case ID_CASE: + pStack->SetStartError(p->GetStart()); + pStack->SetError(TX_OUTCASE, p->GetEnd()); + return nullptr; + } + + pStack->SetStartError(p->GetStart()); + + // should not be a reserved word DefineNum + if (p->GetType() == TokenTypDef) + { + pStack->SetError(TX_RESERVED, p); + return nullptr; + } + + // this might be an instance of class definnition + CBotToken* ppp = p; + if (IsOfType(ppp, TokenTypVar)) + { + if (CBotClass::Find(p) != nullptr) + { + // yes, compiles the declaration of the instance + return CBotClassInst::Compile(p, pStack); + } + } + + // this can be an arythmetic instruction + CBotInstr* inst = CBotExpression::Compile(p, pStack); + if (IsOfType(p, ID_SEP)) + { + return inst; + } + pStack->SetError(TX_ENDOF, p->GetStart()); + delete inst; + return nullptr; +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::Execute(CBotStack* &pj) +{ + CBotString ClassManquante = name; + assert(0); // should never go through this routine + // but use the routines of the subclasses + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::Execute(CBotStack* &pj, CBotVar* pVar) +{ + if (!Execute(pj)) return false; + pVar->SetVal(pj->GetVar()); + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::RestoreState(CBotStack* &pj, bool bMain) +{ + CBotString ClassManquante = name; + assert(0); // should never go through this routine + // but use the routines of the subclasses +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::ExecuteVar(CBotVar* &pVar, CBotCStack* &pile) +{ + assert(0); // dad do not know, see the girls + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prevToken, bool bStep, bool bExtend) +{ + assert(0); // dad do not know, see the girls + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +void CBotInstr::RestoreStateVar(CBotStack* &pile, bool bMain) +{ + assert(0); // dad do not know, see the girls +} + +//////////////////////////////////////////////////////////////////////////////// +bool CBotInstr::CompCase(CBotStack* &pj, int val) +{ + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +CBotInstr* CBotInstr::CompileArray(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool first) +{ + if (IsOfType(p, ID_OPBRK)) + { + if (!IsOfType(p, ID_CLBRK)) + { + pStack->SetError(TX_CLBRK, p->GetStart()); + return nullptr; + } + + CBotInstr* inst = CompileArray(p, pStack, CBotTypResult(CBotTypArrayPointer, type), false); + if (inst != nullptr || !pStack->IsOk()) return inst; + } + + // compiles an array declaration + if (first) return nullptr ; + + CBotInstr* inst = CBotInstArray::Compile(p, pStack, type); + if (inst == nullptr) return nullptr; + + if (IsOfType(p, ID_COMMA)) // several definitions + { + if (nullptr != ( inst->m_next2b = CBotInstArray::CompileArray(p, pStack, type, false))) // compiles next one + { + return inst; + } + delete inst; + return nullptr; + } + + if (IsOfType(p, ID_SEP)) // end of instruction + { + return inst; + } + + delete inst; + pStack->SetError(TX_ENDOF, p->GetStart()); + return nullptr; +} diff --git a/src/CBot/CBotInstr/CBotInstr.h b/src/CBot/CBotInstr/CBotInstr.h new file mode 100644 index 00000000..1f25115e --- /dev/null +++ b/src/CBot/CBotInstr/CBotInstr.h @@ -0,0 +1,266 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsitec.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ + +#pragma once + +// Modules inlcude +#include "CBotToken.h" + +#include "CBotCStack.h" + +// Local include + +// Global include + +/* + for example, the following program + int x[]; x[1] = 4; + int y[x[1]][10], z; + is generated + CBotInstrArray + m_next3b-> CBotEmpty + m_next-> + CBotExpression .... + m_next-> + CBotInstrArray + m_next3b-> CBotExpression ('x') ( m_next3-> CBotIndexExpr ('1') ) + m_next3b-> CBotExpression ('10') + m_next2-> 'z' + m_next->... + +*/ +/*! + * \brief The CBotInstr class Class defining an instruction. + */ +class CBotInstr +{ +public: + + /*! + * \brief CBotInstr + */ + CBotInstr(); + + /*! + * \brief ~CBotInstr + */ + virtual ~CBotInstr(); + + /*! + * \brief Compile Compile an instruction which can be while, do, try, + * throw, if, for, switch, break, continue, return, int, float, boolean, + * string, declaration of an instance of a class, arbitrary expression. + * \param p + * \param pStack + * \return + */ + static CBotInstr* Compile(CBotToken* &p, + CBotCStack* pStack); + + /*! + * \brief CompileArray + * \param p + * \param pStack + * \param type + * \param first + * \return + */ + static CBotInstr* CompileArray(CBotToken* &p, + CBotCStack* pStack, + CBotTypResult type, + bool first = true); + + /*! + * \brief Execute + * \param pj + * \return + */ + virtual bool Execute(CBotStack* &pj); + + /*! + * \brief Execute + * \param pj + * \param pVar + * \return + */ + virtual bool Execute(CBotStack* &pj, + CBotVar* pVar); + + /*! + * \brief RestoreState + * \param pj + * \param bMain + */ + virtual void RestoreState(CBotStack* &pj, + bool bMain); + + /*! + * \brief ExecuteVar + * \param pVar + * \param pile + * \return + */ + virtual bool ExecuteVar(CBotVar* &pVar, + CBotCStack* &pile); + + /*! + * \brief ExecuteVar + * \param pVar + * \param pile + * \param prevToken + * \param bStep + * \param bExtend + * \return + */ + virtual bool ExecuteVar(CBotVar* &pVar, + CBotStack* &pile, + CBotToken* prevToken, + bool bStep, + bool bExtend); + + /*! + * \brief RestoreStateVar + * \param pile + * \param bMain + */ + virtual void RestoreStateVar(CBotStack* &pile, + bool bMain); + + /*! + * \brief CompCase This routine is defined only for the subclass CBotCase + * this allows to make the call on all instructions CompCase to see if it's + * a case to the desired value.. + * \param pj + * \param val + * \return + */ + virtual bool CompCase(CBotStack* &pj, + int val); + + /*! + * \brief SetToken Set the token corresponding to the instruction. + * \param p + */ + void SetToken(CBotToken* p); + + /*! + * \brief GetTokenType Return the type of the token assicated with the + * instruction. + * \return + */ + int GetTokenType(); + + /*! + * \brief GetToken Return associated token. + * \return + */ + CBotToken* GetToken(); + + /*! + * \brief AddNext Adds the statement following the other. + * \param n + */ + void AddNext(CBotInstr* n); + + /*! + * \brief GetNext Returns next statement. + * \return + */ + CBotInstr* GetNext(); + + /*! + * \brief AddNext3 + * \param n + */ + void AddNext3(CBotInstr* n); + + /*! + * \brief GetNext3 + * \return + */ + CBotInstr* GetNext3(); + + /*! + * \brief AddNext3b + * \param n + */ + void AddNext3b(CBotInstr* n); + + /*! + * \brief GetNext3b + * \return + */ + CBotInstr* GetNext3b(); + + /*! + * \brief IncLvl Adds a level with a label. + * \param label + */ + static void IncLvl(CBotString& label); + + /*! + * \brief IncLvl Adds a level (switch statement). + */ + static void IncLvl(); + + /*! + * \brief DecLvl Free a level. + */ + static void DecLvl(); + + /*! + * \brief ChkLvl Control validity of break and continue. + * \param label + * \param type + * \return + */ + static bool ChkLvl(const CBotString& label, int type); + + /*! + * \brief IsOfClass + * \param name + * \return + */ + bool IsOfClass(CBotString name); + +protected: + + //! Keeps the token. + CBotToken m_token; + //! Debug. + CBotString name; + //! Linked command. + CBotInstr* m_next; + //! Second list definition chain. + CBotInstr* m_next2b; + //! Third list for indices and fields. + CBotInstr* m_next3; + //! Necessary for reporting tables. + CBotInstr* m_next3b; + + //! Counter of nested loops, to determine the break and continue valid. + static int m_LoopLvl; + friend class CBotClassInst; + friend class CBotInt; + friend class CBotListArray; + +private: + //! List of labels used. + static CBotStringArray m_labelLvl; +}; diff --git a/src/CBot/CBotInstr/CBotInstrCall.h b/src/CBot/CBotInstr/CBotInstrCall.h index 7e194f8a..fa634fed 100644 --- a/src/CBot/CBotInstr/CBotInstrCall.h +++ b/src/CBot/CBotInstr/CBotInstrCall.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotInstrMethode.h b/src/CBot/CBotInstr/CBotInstrMethode.h index ca4ad90b..ea398115 100644 --- a/src/CBot/CBotInstr/CBotInstrMethode.h +++ b/src/CBot/CBotInstr/CBotInstrMethode.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotInt.h b/src/CBot/CBotInstr/CBotInt.h index 702f5290..085e6265 100644 --- a/src/CBot/CBotInstr/CBotInt.h +++ b/src/CBot/CBotInstr/CBotInt.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotLeftExpr.h b/src/CBot/CBotInstr/CBotLeftExpr.h index f0dba0b4..aaf9ee47 100644 --- a/src/CBot/CBotInstr/CBotLeftExpr.h +++ b/src/CBot/CBotInstr/CBotLeftExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotLeftExprVar.h b/src/CBot/CBotInstr/CBotLeftExprVar.h index a264dbae..fd693727 100644 --- a/src/CBot/CBotInstr/CBotLeftExprVar.h +++ b/src/CBot/CBotInstr/CBotLeftExprVar.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotListArray.h b/src/CBot/CBotInstr/CBotListArray.h index 921273d1..586cc864 100644 --- a/src/CBot/CBotInstr/CBotListArray.h +++ b/src/CBot/CBotInstr/CBotListArray.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotListExpression.h b/src/CBot/CBotInstr/CBotListExpression.h index c4e67115..451b2181 100644 --- a/src/CBot/CBotInstr/CBotListExpression.h +++ b/src/CBot/CBotInstr/CBotListExpression.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotListInstr.h b/src/CBot/CBotInstr/CBotListInstr.h index 763c3a88..0aafaf59 100644 --- a/src/CBot/CBotInstr/CBotListInstr.h +++ b/src/CBot/CBotInstr/CBotListInstr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotLogicExpr.h b/src/CBot/CBotInstr/CBotLogicExpr.h index 2bffc243..db6c67f6 100644 --- a/src/CBot/CBotInstr/CBotLogicExpr.h +++ b/src/CBot/CBotInstr/CBotLogicExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotNew.h b/src/CBot/CBotInstr/CBotNew.h index 77e2b2c6..02598b1a 100644 --- a/src/CBot/CBotInstr/CBotNew.h +++ b/src/CBot/CBotInstr/CBotNew.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotParExpr.h b/src/CBot/CBotInstr/CBotParExpr.h index 60c09933..690d6efb 100644 --- a/src/CBot/CBotInstr/CBotParExpr.h +++ b/src/CBot/CBotInstr/CBotParExpr.h @@ -22,7 +22,7 @@ // Modules inlcude #include "CBot.h" -#include "CBotStack.h" +#include "CBotInstr.h" // Local include diff --git a/src/CBot/CBotInstr/CBotPostIncExpr.h b/src/CBot/CBotInstr/CBotPostIncExpr.h index 5a3240c8..3a30fcef 100644 --- a/src/CBot/CBotInstr/CBotPostIncExpr.h +++ b/src/CBot/CBotInstr/CBotPostIncExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotPreIncExpr.h b/src/CBot/CBotInstr/CBotPreIncExpr.h index ede694d4..896c0c9a 100644 --- a/src/CBot/CBotInstr/CBotPreIncExpr.h +++ b/src/CBot/CBotInstr/CBotPreIncExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotReturn.h b/src/CBot/CBotInstr/CBotReturn.h index 978c6c10..1816bf2d 100644 --- a/src/CBot/CBotInstr/CBotReturn.h +++ b/src/CBot/CBotInstr/CBotReturn.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotSwitch.h b/src/CBot/CBotInstr/CBotSwitch.h index c3f5e02c..b4cff5e4 100644 --- a/src/CBot/CBotInstr/CBotSwitch.h +++ b/src/CBot/CBotInstr/CBotSwitch.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotThrow.h b/src/CBot/CBotInstr/CBotThrow.h index 997550aa..b5227ad7 100644 --- a/src/CBot/CBotInstr/CBotThrow.h +++ b/src/CBot/CBotInstr/CBotThrow.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotTry.h b/src/CBot/CBotInstr/CBotTry.h index 0a8d2b9a..bdc3d4d8 100644 --- a/src/CBot/CBotInstr/CBotTry.h +++ b/src/CBot/CBotInstr/CBotTry.h @@ -21,6 +21,8 @@ #include "CBot.h" #include "CBotCatch.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotTwoOpExpr.h b/src/CBot/CBotInstr/CBotTwoOpExpr.h index 1bcc2f8f..720755fc 100644 --- a/src/CBot/CBotInstr/CBotTwoOpExpr.h +++ b/src/CBot/CBotInstr/CBotTwoOpExpr.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotInstr/CBotWhile.h b/src/CBot/CBotInstr/CBotWhile.h index 5d63909a..528fe8f1 100644 --- a/src/CBot/CBotInstr/CBotWhile.h +++ b/src/CBot/CBotInstr/CBotWhile.h @@ -22,6 +22,8 @@ // Modules inlcude #include "CBot.h" +#include "CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CBotVar/CBotVarClass.cpp b/src/CBot/CBotVar/CBotVarClass.cpp index f07fbe9f..4d6ee787 100644 --- a/src/CBot/CBotVar/CBotVarClass.cpp +++ b/src/CBot/CBotVar/CBotVarClass.cpp @@ -21,11 +21,11 @@ #include "CBotVarClass.h" #include "CBotClass.h" - #include "CBotStack.h" - #include "CBotDefines.h" +#include "CBotInstr/CBotInstr.h" + // Local include // Global include diff --git a/src/CBot/CMakeLists.txt b/src/CBot/CMakeLists.txt index e69beaea..80cb2d0e 100644 --- a/src/CBot/CMakeLists.txt +++ b/src/CBot/CMakeLists.txt @@ -10,6 +10,7 @@ set(SOURCES CBotUtils.cpp CBotDefParam.cpp CBotCallMethode.cpp + CBotInstr/CBotInstr.cpp CBotInstr/CBotWhile.cpp CBotInstr/CBotDo.cpp CBotInstr/CBotFor.cpp