[colobot] 57/377: Move CBotToken class in its own header and source files.

Didier Raboud odyx at moszumanska.debian.org
Wed Mar 30 13:33:57 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 b42c1376e5efa8def4c6e3621f6a69714102c5b9
Author: Grunaka <dev at romainbreton.fr>
Date:   Sun Nov 8 17:49:25 2015 +0100

    Move CBotToken class in its own header and source files.
---
 src/CBot/CBotDll.h      | 152 ++-------------------------
 src/CBot/CBotToken.cpp  |  76 +++++++-------
 src/CBot/CBotToken.h    | 274 ++++++++++++++++++++++++++++++++++++++++++++----
 src/CBot/CMakeLists.txt |  22 ++--
 src/script/script.cpp   |   1 +
 5 files changed, 308 insertions(+), 217 deletions(-)

diff --git a/src/CBot/CBotDll.h b/src/CBot/CBotDll.h
index 57ee15b..dbeaf8f 100644
--- a/src/CBot/CBotDll.h
+++ b/src/CBot/CBotDll.h
@@ -26,8 +26,13 @@
 
 #pragma once
 
-#include <stdio.h>
+// Modules inlcude
 #include "resource.h"
+
+// Local include
+
+// Global include
+#include <stdio.h>
 #include <map>
 #include <cstring>
 
@@ -990,151 +995,6 @@ public:
 
 };
 
-#define    MAXDEFNUM            1000                // limited number of DefineNum
-
-/////////////////////////////////////////////////////////////////////////////////////
-// Token management (tokens)
-
-#define TokenTypKeyWord        1                    // a keyword of the language (see TokenKeyWord)
-#define TokenTypNum            2                    // number
-#define TokenTypString         3                    // string
-#define TokenTypVar            4                    // a variable name
-#define TokenTypDef            5                    // value according DefineNum
-
-#define TokenKeyWord        2000                // keywords of the language
-#define TokenKeyDeclare        2100                // keywords of declarations (int, float,..)
-#define TokenKeyVal            2200                // keywords representing the value (true, false, null, nan)
-#define TokenKeyOp            2300                // operators
-
-/**
- * \class CBotToken
- * Responsible for token management
- */
-class CBotToken
-{
-private:
-    static
-    CBotStringArray    m_ListKeyWords;                // list of keywords of language
-    static
-    int                m_ListIdKeyWords[200];        // the corresponding codes
-
-    static
-    CBotStringArray    m_ListKeyDefine;            // names defined by a DefineNum
-    static
-    long            m_ListKeyNums[MAXDEFNUM];    // the ​​associated values
-
-private:
-    CBotToken*        m_next;                        // following in the list
-    CBotToken*        m_prev;
-    int                m_type;                        // type of Token
-    long            m_IdKeyWord;                // number of the keyword if it is a
-                                                // or value of the "define"
-
-    CBotString        m_Text;                        // word found as token
-    CBotString        m_Sep;                        //  following separators
-
-    int                m_start;                    // position in the original text (program)
-    int                m_end;                        // the same for the end of the token
-
-    /**
-     * \brief Check whether given parameter is a keyword
-     */
-    static
-    int                GetKeyWords(const char* w);    // is it a keyword?
-    static
-    bool            GetKeyDefNum(const char* w, CBotToken* &token);
-
-    /**
-     * \brief Loads the list of keywords
-     */
-    static
-    void            LoadKeyWords();
-
-public:
-    /**
-     * \brief Constructors
-     */
-                    CBotToken();
-                    CBotToken(const CBotToken* pSrc);
-                    CBotToken(const CBotString& mot, const CBotString& sep, int start=0, int end=0);
-                    CBotToken(const char* mot, const char* sep = nullptr);
-
-    /**
-     * \brief Destructor
-     */
-                    ~CBotToken();
-    /**
-     * \brief Returns the type of token
-     */
-    int                GetType();
-
-    /**
-     * \brief makes the string corresponding to this token
-     */
-    CBotString&        GetString();
-
-    /**
-     * \brief makes the following separator token
-     */
-    CBotString&        GetSep();
-
-    /**
-     * \brief position of the beginning in the text
-     */
-    int                GetStart();
-    /**
-     * \brief end position in the text
-     */
-    int                GetEnd();
-
-    /**
-     * \brief gives the next token in the list
-     */
-    CBotToken*        GetNext();
-    /**
-     * \brief gives the previous token in a list
-     */
-    CBotToken*        GetPrev();
-
-    /**
-     * \brief transforms the entire program
-     */
-    static
-    CBotToken*        CompileTokens(const char* p, int& error);
-
-    /**
-     * \brief releases the list
-     */
-    static
-    void            Delete(CBotToken* pToken);    // libère la liste
-
-
-    // fonctions non utiles en export
-    static
-    bool            DefineNum(const char* name, long val);
-    void            SetString(const char* name);
-
-    void            SetPos(int start, int end);
-    long            GetIdKey();
-    /**
-     * \brief adds a token (a copy)
-     */
-    void            AddNext(CBotToken* p);
-
-    /**
-     * finds the next token
-     */
-    static
-    CBotToken*        NextToken(char* &program, int& error, bool first = false);
-
-    const CBotToken&
-                    operator=(const CBotToken& src);
-
-    static
-    void            Free();
-};
-
-
 
 /*
 ////////////////////////////////////////////////////////////////////////
diff --git a/src/CBot/CBotToken.cpp b/src/CBot/CBotToken.cpp
index 1252946..2b06c0f 100644
--- a/src/CBot/CBotToken.cpp
+++ b/src/CBot/CBotToken.cpp
@@ -17,24 +17,21 @@
  * along with this program. If not, see http://gnu.org/licenses
  */
 
+// Modules inlcude
+#include "CBot.h"
 
-//////////////////////////////////////////////////////////////////
-// Managing Tokens
-// the text of a program is first transformed
-// into a sequence of tokens for easy interpretation
-// it will only treat the case as an error
-// where there is an illegal character in a string
-
+// Local include
 
-#include "CBot.h"
+// Global include
 #include <cstdarg>
 
+////////////////////////////////////////////////////////////////////////////////
 CBotStringArray CBotToken::m_ListKeyWords;
 int CBotToken::m_ListIdKeyWords[200];
 CBotStringArray CBotToken::m_ListKeyDefine;
 long CBotToken::m_ListKeyNums[MAXDEFNUM];
 
-//! contructors
+////////////////////////////////////////////////////////////////////////////////
 CBotToken::CBotToken()
 {
     m_next = nullptr;
@@ -43,6 +40,7 @@ CBotToken::CBotToken()
     m_IdKeyWord = -1;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 CBotToken::CBotToken(const CBotToken* pSrc)
 {
     m_next = nullptr;
@@ -71,6 +69,7 @@ CBotToken::CBotToken(const CBotToken* pSrc)
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
 CBotToken::CBotToken(const CBotString& mot, const CBotString& sep, int start, int end)
 {
     m_Text  = mot;                  // word (mot) found as token
@@ -95,17 +94,20 @@ CBotToken::CBotToken(const char* mot, const char* sep)
     m_IdKeyWord = -1;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 CBotToken::~CBotToken()
 {
     delete  m_next;                 // recursive
     m_next = nullptr;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 void CBotToken::Free()
 {
     m_ListKeyDefine.SetSize(0);
 }
 
+////////////////////////////////////////////////////////////////////////////////
 const CBotToken& CBotToken::operator=(const CBotToken& src)
 {
     delete m_next;
@@ -123,7 +125,7 @@ const CBotToken& CBotToken::operator=(const CBotToken& src)
     return *this;
 }
 
-
+////////////////////////////////////////////////////////////////////////////////
 int CBotToken::GetType()
 {
     if (this == nullptr) return 0;
@@ -131,69 +133,66 @@ int CBotToken::GetType()
     return m_type;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 long CBotToken::GetIdKey()
 {
     return m_IdKeyWord;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 CBotToken* CBotToken::GetNext()
 {
     if (this == nullptr) return nullptr;
     return      m_next;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 CBotToken* CBotToken::GetPrev()
 {
     if (this == nullptr) return nullptr;
     return      m_prev;
 }
 
-void CBotToken::AddNext(CBotToken* p)
-{
-    CBotToken*  n = new CBotToken(p);
-    CBotToken*  pt = this;
-
-    while ( pt->m_next != nullptr ) pt = pt->m_next;
-
-    pt->m_next = n;
-    n->m_prev = pt;
-}
-
-
-CBotString& CBotToken::GetString()
+////////////////////////////////////////////////////////////////////////////////
+CBotString CBotToken::GetString()
 {
     return  m_Text;
 }
 
-CBotString& CBotToken::GetSep()
+////////////////////////////////////////////////////////////////////////////////
+CBotString CBotToken::GetSep()
 {
     return  m_Sep;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 void CBotToken::SetString(const char* name)
 {
     m_Text = name;
 }
 
-
+////////////////////////////////////////////////////////////////////////////////
 int CBotToken::GetStart()
 {
     if (this == nullptr) return -1;
     return m_start;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 int CBotToken::GetEnd()
 {
     if (this == nullptr) return -1;
     return m_end;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 void CBotToken::SetPos(int start, int end)
 {
     m_start = start;
     m_end   = end;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 bool CharInList(const char c, const char* list)
 {
     int     i = 0;
@@ -205,6 +204,7 @@ bool CharInList(const char c, const char* list)
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
 bool Char2InList(const char c, const char cc, const char* list)
 {
     int     i = 0;
@@ -225,11 +225,7 @@ static char    num[]  = "0123456789";                        // point (single) i
 static char    hexnum[]   = "0123456789ABCDEFabcdef";
 static char    nch[]  = "\"\r\n\t";                          // forbidden in chains
 
-//static char*  duo  = "+=-=*=/===!=<=>=++--///**/||&&";    // double operators
-
-// looking for the next token in a sentence
-// do not start with separators
-// which are made in the previous token
+////////////////////////////////////////////////////////////////////////////////
 CBotToken*  CBotToken::NextToken(char* &program, int& error, bool first)
 {
     CBotString      mot;                // the word which is found
@@ -389,6 +385,7 @@ bis:
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
 CBotToken* CBotToken::CompileTokens(const char* program, int& error)
 {
     CBotToken       *nxt, *prv, *tokenbase;
@@ -431,14 +428,13 @@ CBotToken* CBotToken::CompileTokens(const char* program, int& error)
     return tokenbase;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 void CBotToken::Delete(CBotToken* pToken)
 {
     delete pToken;
 }
 
-
-// search if a word is part of the keywords
-
+////////////////////////////////////////////////////////////////////////////////
 int CBotToken::GetKeyWords(const char* w)
 {
     int     i;
@@ -458,6 +454,7 @@ int CBotToken::GetKeyWords(const char* w)
     return -1;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 bool CBotToken::GetKeyDefNum(const char* w, CBotToken* &token)
 {
     int     i;
@@ -476,12 +473,7 @@ bool CBotToken::GetKeyDefNum(const char* w, CBotToken* &token)
     return false;
 }
 
-
-/// \todo Fixme Figure out how this should work.
-
-// recreates the list of keywords and its IDs basing on some resources
-// defines of TokenKey.. are in CBotDll.h
-
+////////////////////////////////////////////////////////////////////////////////
 void CBotToken::LoadKeyWords()
 {
     CBotString      s;
@@ -517,6 +509,7 @@ void CBotToken::LoadKeyWords()
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
 bool CBotToken::DefineNum(const char* name, long val)
 {
     int     i;
@@ -533,6 +526,7 @@ bool CBotToken::DefineNum(const char* name, long val)
     return true;
 }
 
+////////////////////////////////////////////////////////////////////////////////
 bool IsOfType(CBotToken* &p, int type1, int type2)
 {
     if (p->GetType() == type1 ||
@@ -543,8 +537,8 @@ bool IsOfType(CBotToken* &p, int type1, int type2)
     }
     return false;
 }
-// Same with any number of arguments
-// There must be a zero as the last argument
+
+////////////////////////////////////////////////////////////////////////////////
 bool IsOfTypeList(CBotToken* &p, int type1, ...)
 {
     int     i = type1;
diff --git a/src/CBot/CBotToken.h b/src/CBot/CBotToken.h
index 3e0269e..b82cdfe 100644
--- a/src/CBot/CBotToken.h
+++ b/src/CBot/CBotToken.h
@@ -17,28 +17,264 @@
  * along with this program. If not, see http://gnu.org/licenses
  */
 
+#pragma once
 
-// interpreter of the lanuage CBot for game COLOBOT
-// writing a program is first transformed into a list of tokens
-// before tackling the compiler itself
-// for example
-// int var = 3 * ( pos.y + x )
-// is decomposed into (each line is a token)
-//      int
-//      var
-//      =
-//      3
-//      *
-//      (
-//      pos.y
-//      +
-//      x
-//      )
+// Modules inlcude
+#include "CBotDll.h"
 
-#pragma once
+// Local include
+
+// Global include
+
+/////////////////////////////////////////////////////////////////////////////////////
+// Token management (tokens)
+
+#define TokenTypKeyWord 1    // a keyword of the language (see TokenKeyWord)
+#define TokenTypNum     2    // number
+#define TokenTypString  3    // string
+#define TokenTypVar     4    // a variable name
+#define TokenTypDef     5    // value according DefineNum
+
+#define TokenKeyWord    2000 // keywords of the language
+#define TokenKeyDeclare 2100 // keywords of declarations (int, float,..)
+#define TokenKeyVal     2200 // keywords representing the value (true, false, null, nan)
+#define TokenKeyOp      2300 // operators
+
+#define MAXDEFNUM 1000 // limited number of DefineNum
+
+/**
+ * \class CBotToken
+ * Responsible for token management. A CBot program is a text string. This string
+ * is first transformed into a list of token. It will only treat the case as an
+ * error where there is an illegal character in a string.
+ * For example :
+ *     int var = 3 * ( pos.y + x )
+ *  is decomposed into (each line is a token)
+ *      int
+ *      var
+ *      =
+ *      3
+ *      *
+ *      (
+ *      pos.y
+ *      +
+ *      x
+ *      )
+ */
+
+class CBotToken
+{
+
+public:
+
+    /*!
+     * \brief CBotToken Default Constructor.
+     */
+    CBotToken();
+    CBotToken(const CBotToken* pSrc);
+    CBotToken(const CBotString& mot,
+              const CBotString& sep,
+              int start=0,
+              int end=0);
+    CBotToken(const char* mot, const char* sep = nullptr);
+
+    /*!
+     * \brief ~CBotToken Destructor. Be careful when you delete a CBotToken that
+     *  is in a linked list all the following CBotToken will be deleted too.
+     */
+    ~CBotToken();
+
+    /*!
+     * \brief GetType Return the token type or the keyword id.
+     * \return The token type or the keyword id.
+     */
+    int GetType();
+
+    /*!
+     * \brief GetString Return the token string.
+     * \return The token string if a string has been set. An empty string
+     * otherwise.
+     */
+    CBotString GetString();
+
+    /*!
+     * \brief SetString Set the token string.
+     * \param [in] name The new string to set.
+     */
+    void SetString(const char* name);
+
+    /*!
+     * \brief GetSep Return the token separator.
+     * \return The token separator a separator has been set. An empty separator
+     *  otherwise.
+     */
+    CBotString GetSep();
+
+    /*!
+     * \brief GetStart Return the start position of the string token in the
+     * original CBotProgram.
+     * \return The start position of the string token or -1 if no string has
+     * been set.
+     */
+    int GetStart();
+
+    /*!
+     * \brief GetEnd Return the end position of the string token in the
+     * original CBotProgram.
+     * \return The start position of the string token or -1 if no string has
+     * been set.
+     */
+    int GetEnd();
+
+    /*!
+     * \brief GetNext Gives the next CBotToken in the list.
+     * \return The next CBotToken if set nullptr otherwise.
+     */
+    CBotToken* GetNext();
+
+    /*!
+     * \brief GetPrev Gives the previous CBotToken in the list.
+     * \return The previous CBotToken if set nullptr otherwise.
+     */
+    CBotToken* GetPrev();
 
-class CBotToken;
+    /*!
+     * \brief SetPos Set the token position in the CBot program.
+     * \param [in] start The start position of the token.
+     * \param [in] end The end position of the token.
+     */
+    void SetPos(int start, int end);
 
+    /*!
+     * \brief GetIdKey Get the token id key.
+     * \return The id key.
+     */
+    long GetIdKey();
+
+    /*!
+     * \brief operator =
+     * \param [in] src The CBotToken to copy.
+     * \return The CBotToken with the copied value.
+     */
+    const CBotToken& operator=(const CBotToken& src);
+
+    /*!
+     * \brief CompileTokens This function will transform the entire CBot program
+     * in CBotToken. If an error occured during the processing an error number
+     * will be set. Each CBotToken will be linked with the previous one and the
+     * next one.
+     * \param [in] p The program string.
+     * \param [out] error The error code.
+     * \return The first token of the linked liste.
+     * \todo Replace the error code by an enum.
+     */
+    static CBotToken* CompileTokens(const char* p, int& error);
+
+    /*!
+     * \brief NextToken Looking for the next token in the string. The string must
+     * not start with separators. The separator is part of the previous token.
+     * \param [in] program The program string.
+     * \param [out] error The error code.
+     * \param [in] first True if this is the first call false othewise.
+     * \return A CBotTOken.
+     */
+    static CBotToken* NextToken(char* &program, int& error, bool first = false);
+
+    /**
+     * \brief Delete Releases the CBotToken linked list.
+     * \deprecated This function is deprecated because it only delete a pointer.
+     * \todo Remove this function.
+     */
+    static void Delete(CBotToken* pToken);
+
+    /*!
+     * \brief DefineNum This function define a language keyword with an associated
+     * number.
+     * \param [in] name The new word to define.
+     * \param [in] val The number associated with the keyword.
+     * \return Ture if the number is available false oterhwise.
+     */
+    static bool DefineNum(const char* name, long val);
+
+    /*!
+     * \brief Free Free the array created with DefineNum.
+     * \see DefineNum
+     */
+    static void Free();
+
+private:
+
+    //! The next token in the linked list
+    CBotToken* m_next; // following in the list
+    //! The previous token in the linked list
+    CBotToken* m_prev;
+    //! The token type
+    int m_type; // type of Token
+    //! The id of the keyword
+    long m_IdKeyWord;
+
+    //! The token string
+    CBotString m_Text;
+    //! The token separator
+    CBotString m_Sep;
+
+    //! The strat position of the token in the CBotProgram
+    int m_start;
+    //! The end position of the token in the CBotProgram
+    int m_end;
+
+    /*!
+     * \brief GetKeyWords Check if the word is a keyword.
+     * \param w The word to compare.
+     * \return -1 if this is not a keyword the keyword number otherwise.
+     */
+    static int GetKeyWords(const char* w);    // is it a keyword?
+
+    /*!
+     * \brief GetKeyDefNum Check if this is a defined word and set the defined
+     * word type in a CBotToken.
+     * \param [in] w The word to compaire.
+     * \param [out] token The token in which the type will be set.
+     * \return True if the defined word is found false otherwise.
+     */
+    static bool GetKeyDefNum(const char* w, CBotToken* &token);
+
+    /*!
+     * \brief LoadKeyWords Loads the list of keywords. The list of keyword is
+     * CBotString::s_keywordString. This keywords are keywords languages (if, +,
+     * for, while, case, extern ...)
+     * \todo Fixme Figure out how this should work.
+     */
+    static void LoadKeyWords();
+
+    //! List of keywords of the CBot language (if, +, for, while, case, extern ...)
+    static CBotStringArray m_ListKeyWords;
+    //! List of id correponding to the keywords of the CBot language
+    static int m_ListIdKeyWords[200];
+
+    //! List of CBot language error and list of colobot specific keywords
+    //! This keywords are defined in :
+    //!      - void CScriptFunctions::Init()
+    //!      - void CBotProgram::Init()
+    static CBotStringArray m_ListKeyDefine;
+    //! List of id correponding to the defined words
+    static long m_ListKeyNums[MAXDEFNUM];
+
+};
+
+/*!
+ * \brief IsOfType This function tell if a token is of a specific type.
+ * \param [in] p The token to compare.
+ * \param [in] type1 First token type to comapre to the token.
+ * \param [in] type2 Second token type to comapre to the token.
+ * \return True if the type of the token match one of a parameter.
+ */
 extern bool IsOfType(CBotToken* &p, int type1, int type2 = -1);
-extern bool IsOfTypeList(CBotToken* &p, int type1, ...);
 
+/*!
+ * \brief IsOfType This function tell if a token is of a specific type.
+ * \param [in] p The token to compare.
+ * \param [in] type1 The list of token type to comapre to the token.
+ * \return True if the type of the token match one of a parameter.
+ */
+extern bool IsOfTypeList(CBotToken* &p, int type1, ...);
diff --git a/src/CBot/CMakeLists.txt b/src/CBot/CMakeLists.txt
index 8bb8a5c..dc7707f 100644
--- a/src/CBot/CMakeLists.txt
+++ b/src/CBot/CMakeLists.txt
@@ -1,15 +1,15 @@
 set(SOURCES
-CBot.cpp
-CBotClass.cpp
-CBotFunction.cpp
-CBotIf.cpp
-CBotProgram.cpp
-CBotStack.cpp
-CBotString.cpp
-CBotToken.cpp
-CBotTwoOpExpr.cpp
-CBotVar.cpp
-CBotWhile.cpp
+    CBot.cpp
+    CBotClass.cpp
+    CBotFunction.cpp
+    CBotIf.cpp
+    CBotProgram.cpp
+    CBotStack.cpp
+    CBotString.cpp
+    CBotToken.cpp
+    CBotTwoOpExpr.cpp
+    CBotVar.cpp
+    CBotWhile.cpp
 )
 
 if(CBOT_STATIC)
diff --git a/src/script/script.cpp b/src/script/script.cpp
index 9bfb1da..4ba1f17 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -42,6 +42,7 @@
 #include "ui/controls/interface.h"
 #include "ui/controls/list.h"
 
+#include "CBot/CBotToken.h"
 
 
 const int CBOT_IPF = 100;       // CBOT: default number of instructions / frame

-- 
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