]> gitweb.hamatoma.de Git - reqt/commitdiff
dayly work
authorhama <hama@siduction.net>
Sat, 16 Aug 2014 22:20:17 +0000 (00:20 +0200)
committerhama <hama@siduction.net>
Sat, 16 Aug 2014 22:21:29 +0000 (00:21 +0200)
19 files changed:
.gitignore
D [new file with mode: 0755]
rplcore/rplconfig.cpp
rplcore/rplexception.cpp
rplcore/rpllogger.cpp
rplcore/rplterminator.cpp
rpldoc.zip
rplexpr/rplasclasses.cpp
rplexpr/rplasclasses.hpp
rplexpr/rplastree.cpp
rplexpr/rplastree.hpp
rplexpr/rpllexer.cpp
rplexpr/rplmfparser.cpp
rplexpr/rplvm.cpp
rplexpr/rplvm.hpp
rplmodules.hpp
rplnet/rpltcpclient.cpp
rplnet/rpltcppeer.cpp
rplnet/rpltcpserver.cpp

index 147a93ce581fbb4a13d72c9ece3fa259c3a2f69e..c597c108e5236ce4bebdb0cf4ecf61ea9ab59ec3 100644 (file)
@@ -1,3 +1,6 @@
 *-conflict_*
 *~
 *.pro.user
+doc/
+*.log
+
diff --git a/D b/D
new file mode 100755 (executable)
index 0000000..df9c71b
--- /dev/null
+++ b/D
@@ -0,0 +1,7 @@
+#! /bin/bash
+
+ZIP=rpldoc.zip
+rm -Rf $ZIP doc/
+doxygen
+zip -qr9 $ZIP doc/
+ls -ld $ZIP
index ba965715eba787a1d4ba286614dbb49def360ef4..642a64777950cd111d707727e7ced25151267d61 100644 (file)
@@ -31,7 +31,7 @@
  */
 
 enum Locations {
-    LOC_WRITE_1 = RPL_FIRST_OF(RPLMODULE_CONFIG),
+    LOC_WRITE_1 = RPL_FIRST_OF(RPLMODULE_CONFIG),   // 10201
     LOC_WRITE_2,
     LOC_READ_1,
     LOC_READ_2,
index dcc77f44141b4f77ef6b0ffd43fcd0676452ba33..c6528f62b27b0a7458451ef74324d9fc86dd4b5b 100644 (file)
@@ -30,7 +30,7 @@
 /** @file
  * @brief Generally usable exceptions.
  */
-/** @file rplcore/rplexeption.hpp
+/** @file rplcore/rplexception.hpp
  *
  * @brief Definitions for a generally usable exceptions.
  */
index f8ac50d64090e9a272365d6a5937a6b2960f882c..b201c2777f129eafae7a82ecf8d8c1fc9ed8ceea 100644 (file)
@@ -18,7 +18,7 @@
 #include <iostream>
 
 enum {
-    LOC_ADD_APPENDER_1 = RPL_FIRST_OF(RPLMODULE_LOGGER), // 10000
+    LOC_ADD_APPENDER_1 = RPL_FIRST_OF(RPLMODULE_LOGGER), // 10101
 };
 
 RplLogger* RplLogger::m_globalLogger = NULL;
index a223ddd4262ae52c75bcfcf2cdb37356d3a974cb..4fab7942dc794d87cb5f04eca633b539644f18a0 100644 (file)
@@ -14,7 +14,7 @@
 #include "rplcore.hpp"
 
 enum {
-    LOC_CAUSE_TERMINATION_1 = RPL_FIRST_OF(RPLMODULE_TERMINATOR), // 901
+    LOC_CAUSE_TERMINATION_1 = RPL_FIRST_OF(RPLMODULE_TERMINATOR), // 10901
 };
 
 /**
index 020aa682e538b5b4a1ca04dbe47d967764393bbc..340d79e69fe8774ccde6abc821f5d1bcf1e2027b 100644 (file)
Binary files a/rpldoc.zip and b/rpldoc.zip differ
index 1ecd6a00a6841079e55f8fd8677e45294f06c906..0dc027349b38b2ad02ddf4cea0aea68d190e04ef 100644 (file)
@@ -104,6 +104,38 @@ RplSymbolSpace::~RplSymbolSpace()
     }
 }
 
+/**
+ * @brief Starts a scope.
+ *
+ * A scope is an "area" where variables can be defined.
+ * A variable "lives" in a scope.
+ *
+ * Saves the status to restore it in <code>finishScope()</code>.
+ *
+ * @param scope     OUT: status info
+ */
+void RplSymbolSpace::startScope(RplASScope& scope)
+{
+    scope.m_varNoAtStart = m_listOfVars.size();
+}
+
+/**
+ * @brief Finishes a scope.
+ *
+ * Finishes the "live" of the variables created in the ending scope.
+ *
+ * @param scope     the status of the scope at start.
+ */
+void RplSymbolSpace::finishScope(RplASScope& scope)
+{
+    // in methods/classes not needed:
+    for (ix = scope.m_varNoAtStart; ix < m_listOfVars.size(); ix++){
+        const QString& name = m_listOfVars[ix]->name();
+        if (m_variables.contains(name))
+            m_variables.remove(name);
+    }
+}
+
 /**
  * @brief Search the class in the symbol space hierarchy.
  *
@@ -312,10 +344,11 @@ void RplSymbolSpace::setBody(RplASItem* body)
  * @brief Adds a variable to the symbol space.
  *
  * @param variable  the variable to add
+ * @param varNo     OUT: variable number, current number in the symbol space
  * @return          NULL: success<br>
  *                  otherwise: the already defined variable/method
  */
-RplASItem* RplSymbolSpace::addVariable(RplASVarDefinition* variable)
+RplASItem* RplSymbolSpace::addVariable(RplASVarDefinition* variable, int& varNo)
 {
     RplASItem* rc = NULL;
     const QString& name = variable->name();
@@ -325,6 +358,8 @@ RplASItem* RplSymbolSpace::addVariable(RplASVarDefinition* variable)
         rc = m_methods[name];
     else {
         m_variables[name] = variable;
+        varNo = m_listOfVars.size();
+        m_listOfVars.append(variable);
     }
     return rc;
 }
@@ -891,6 +926,25 @@ void RplVariable::dump(RplWriter& writer, int indent)
            name1.constData(),
            name2.constData(), val.constData());
 }
+/**
+ * @brief Returns the data type of the variable.
+ *
+ * @return  the class of the variable
+ */
+RplASClass* RplVariable::type() const
+{
+    return m_type;
+}
+
+/**
+ * @brief Sets the data type.
+ * @param type  the class of the variable
+ */
+void RplVariable::setType(RplASClass* type)
+{
+    m_type = type;
+}
+
 
 /** @class RplVariable rplastree.hpp "rplexpr/rplastree.hpp"
  *
index c666a8d0b6825ce7103be1f32c1b41c3c872b678..e47dbbbce75ea342dbe7566b66dca02ff6909d2f 100644 (file)
@@ -17,6 +17,9 @@ public:
 public:
     void dump(RplWriter& writer, int indent);
 
+    RplASClass* type() const;
+    void setType(RplASClass* type);
+
 protected:
     QString m_name;
     // NULL for "simple" variables (int, float, bool)
@@ -25,6 +28,14 @@ protected:
     RplASClass* m_type;
 };
 
+class RplASScope
+{
+public:
+    RplASScope();
+public:
+    int m_varNoAtStart;
+};
+
 class RplASUserClass;
 class RplASTree;
 class RplSymbolSpace
@@ -50,6 +61,8 @@ public:
                    RplSymbolSpace* parent);
     virtual ~RplSymbolSpace();
 public:
+    void startScope(RplASScope& scope);
+    void finishScope(RplASScope& scope);
     RplVariable* findVariable(const QString& name) const;
     RplASClass* findClass(const QString& name) const;
     RplASMethod* findMethod(const QString& name) const;
index 83410692f7f020507951a3dd785375eea92ee7b1..e596e990b8820d7b959dcdc13ede97b2f2c995d5 100644 (file)
@@ -20,7 +20,7 @@
 #include "rplexpr/rplexpr.hpp"
 
 enum {
-    LOC_VARDEF_EXEC_1 = RPL_FIRST_OF(RPL_MODULE_ASTREE), // 10001
+    LOC_VARDEF_EXEC_1 = RPL_FIRST_OF(RPL_MODULE_ASTREE), // 11001
     LOC_UNOP_1,
     LOC_UNOP_2,
     LOC_UNOP_3,
@@ -869,21 +869,6 @@ RplASMapOfVariants* RplASMapConstant::map()
  * <code>m_child</code>: NULL or the index expression (map/list)
  */
 
-/**
- * @brief Constructor.
- *
- * @param name      the name of the instance
- */
-RplASNamedValue::RplASNamedValue(const QString& name) :
-    RplASNode1(AST_NAMED_VALUE),
-    m_name(name),
-    m_attributes(0),
-    m_dataType(NULL),
-    m_symbolSpace(NULL),
-    m_variableNo(0)
-{
-}
-
 /**
  * @brief Constructor.
  *
@@ -891,13 +876,13 @@ RplASNamedValue::RplASNamedValue(const QString& name) :
  * @param name          the name of the variable
  * @param attributes    the attributes of the variable
  */
-RplASNamedValue::RplASNamedValue(RplASClass* dataType,
-                                  const QString& name, int attributes) :
+RplASNamedValue::RplASNamedValue(RplASClass* dataType,RplSymbolSpace* space,
+                                 const QString& name, int attributes) :
     RplASNode1(AST_NAMED_VALUE),
     m_name(name),
     m_attributes(attributes),
     m_dataType(dataType),
-    m_symbolSpace(NULL),
+    m_symbolSpace(space),
     m_variableNo(0)
 {
 }
@@ -974,6 +959,17 @@ RplSymbolSpace*RplASNamedValue::symbolSpace() const
     return m_symbolSpace;
 }
 
+/**
+ * @brief Sets the variable no in the instance.
+ *
+ * @param variableNo    the variable number
+ */
+void RplASNamedValue::setVariableNo(int variableNo)
+{
+    m_variableNo = variableNo;
+}
+
+
 /**
  * @brief Returns the variable no of the variable.
  *
index 19168757633f5b4a90c705522f69d2cc412932ca..5ab5a9395dde35a8a105f1c5d6a3204c4f0b6e4b 100644 (file)
@@ -308,12 +308,13 @@ public:
         /// the evaluation should be lazy
         A_LAZY          = 1<<4,
         /// parameter of a method
-        A_PARAM         = 1<<5
+        A_PARAM         = 1<<5,
+        /// a automatic variable in counted for loops:
+        A_LOOP          = 1<<6
     };
 
 public:
-    RplASNamedValue(const QString& name);
-    RplASNamedValue(RplASClass* dataType,
+    RplASNamedValue(RplASClass* dataType, RplSymbolSpace* space,
                     const QString& name, int attributes);
 public:
     const QString& name() const;
@@ -324,6 +325,7 @@ public:
     void assign(RplVMThread& thread);
     RplSymbolSpace* symbolSpace() const;
     int variableNo() const;
+    void setVariableNo(int variableNo);
 protected:
     QString m_name;
     int m_attributes;
index b0bb76accb798be2c57cf4ab66a20cb5fe743f91..bbfed458d9c5fac5139c11d1736b9154c2c48d15 100644 (file)
@@ -8,7 +8,7 @@
 /** @file
  * @brief Configurable scanner, wich separates syntactic symbols from an input media.
  */
-/** @file rplexpr/rpllexxer.hpp
+/** @file rplexpr/rpllexer.hpp
  * @brief Definitions for a configurable lexical analyser.
  */
 
index 406533c4f247e9a6f7c866edf23f91c0ee21d222..f057e3cc1d00841d2d3be24d91a03f210f549bc9 100644 (file)
@@ -176,7 +176,9 @@ RplASItem* RplMFParser::parseFor()
     RplToken* token = m_lexer.nextNonSpaceToken();
     RplASNamedValue* var = NULL;
     if (token->isTokenType(TOKEN_ID)){
-        var = new RplASNamedValue(token->toString());
+        var = new RplASNamedValue(RplASInteger::m_instance,
+                                  m_tree.currentSpace(), token->toString(),
+                                  RplASNamedValue::A_LOOP);
         var->setPosition(m_lexer.currentPosition());
         token = m_lexer.nextNonSpaceToken();
     }
@@ -249,8 +251,10 @@ RplASItem* RplMFParser::parseVarDefinition(RplASNamedValue::Attributes attribute
     token = m_lexer.nextNonSpaceToken();
     if (! token->isTokenType(TOKEN_ID))
         syntaxError(L_DEFINITION_MISSING_ID, "variable name expected");
+    RplSymbolSpace* symbols = m_tree.currentSpace();
     // freed in the destructor of the nodes:
-    RplASNamedValue* namedValue = new RplASNamedValue(clazz, token->toString(),
+    RplASNamedValue* namedValue = new RplASNamedValue(clazz, symbols,
+                                                      token->toString(),
                                                       attributes);
     namedValue->setPosition(m_lexer.currentPosition());
     RplASVarDefinition* rc = new RplASVarDefinition();
@@ -262,11 +266,12 @@ RplASItem* RplMFParser::parseVarDefinition(RplASNamedValue::Attributes attribute
         rc->setChild3(value);
         token = m_lexer.currentToken();
     }
-    RplSymbolSpace* symbols = m_tree.currentSpace();
-    RplASItem* oldSymbol = symbols->addVariable(rc);
+    int varNo = 0;
+    RplASItem* oldSymbol = symbols->addVariable(rc, varNo);
     if (oldSymbol != NULL)
         error(L_PARSE_VAR_DEF_ALREADY_DEFINED, oldSymbol->position(),
               "symbol already defined", "previous definition");
+    namedValue->setVariableNo(varNo);
     return rc;
 }
 
@@ -483,7 +488,7 @@ RplASItem* RplMFParser::parseMap()
 }
 
 /**
- * @brief Builds a node of a variable or a field.
+ * @brief Builds a node of a variable or a field (as an operand).
  *
  * @param name      name of the variable/field
  * @param position  source position
@@ -497,7 +502,13 @@ RplASItem* RplMFParser::buildVarOrField(const QString& name,
 {
     RplASItem* rc = NULL;
     if (parent == NULL){
-        RplASNamedValue* var = new RplASNamedValue(name);
+        RplSymbolSpace* space = m_tree.currentSpace();
+        RplVariable* var = space->findVariable(name);
+        RplASClass* clazz = NULL;
+        if (var != NULL)
+            clazz = var->type();
+        RplASNamedValue* var = new RplASNamedValue(clazz, space,
+                                                   name, RplASNamedValue::A_NONE);
         var->setPosition(position);
         rc = var;
     } else {
@@ -920,6 +931,8 @@ RplASItem* RplMFParser::parseBody(Keyword keywordStop, Keyword keywordStop2,
     RplASItem* item = NULL;
     RplASItem* body = NULL;
     RplASNode1* lastStatement = NULL;
+    RplASScope scope;
+    m_tree.currentSpace()->startScope(scope);
     bool again = true;
     const RplSourcePosition* lastPos = NULL;
     do {
@@ -1039,6 +1052,9 @@ RplASItem* RplMFParser::parseBody(Keyword keywordStop, Keyword keywordStop2,
                 }
         }
     } while(again);
+
+    if (keywordStop != K_ENDF && keywordStop != K_ENDC)
+        m_tree.currentSpace()->finishScope(scope);
     return body;
 }
 
index d3eb63b970fb69206f5488686dd68f310243883e..2c681af37925faeeaf4b52fde047110b6897bdfe 100644 (file)
 #include "rplcore/rplcore.hpp"
 #include "rplexpr/rplexpr.hpp"
 
+enum {
+    LOC_VAL_OF_VAR_1 = RPL_FIRST_OF(RPL_MODULE_VM), // 11401
+    LOC_UNOP_1,
+    LOC_UNOP_2,
+    LOC_UNOP_3,
+    LOC_UNOP_4, // 10005
+    LOC_BINOP_1,
+    LOC_COUNT
+};
+
 int RplVMThread::m_nextId = 1;
 
 /** @class RplVmException rplvm.hpp "rplexpr/rplvm.hpp"
@@ -89,6 +99,15 @@ RplASVariant& RplStackFrame::valueOfVariable(int index)
         throw RplVmException("valueOfVariable(): invalid index: %d", index);
     return m_variables[index];
 }
+/**
+ * @brief Returns the symbol space of the frame.
+ *
+ * @return  the symbol space
+ */
+RplSymbolSpace* RplStackFrame::symbols() const
+{
+    return m_symbols;
+}
 
 /** @class RplVMThread rplvm.hpp "rplexpr/rplvm.hpp"
  *
@@ -109,7 +128,9 @@ RplVMThread::RplVMThread(int maxStack, RplVirtualMachine* vm) :
     m_singleStep(false),
     m_debugMode(false),
     m_maxStack(maxStack),
-    m_stack(),
+    m_frameStack(),
+    // the stack is never empty!
+    m_topOfFrames(0),
     m_valueStack(),
     // the stack is never empty!
     m_topOfValues(1),
@@ -118,7 +139,9 @@ RplVMThread::RplVMThread(int maxStack, RplVirtualMachine* vm) :
 {
     QByteArray prefix = "vm_thread_" + QByteArray::number(m_id);
     m_logger->buildStandardAppender(prefix);
-    m_stack.reserve(maxStack);
+    m_frameStack.reserve(maxStack);
+    // the stack is never empty!
+    m_frameStack.append(new RplStackFrame(vm->tree().symbolSpaces()[0]));
     // the stack is never empty!
     m_valueStack.append(new RplASVariant);
 }
@@ -250,6 +273,18 @@ RplASVariant& RplVMThread::valueOfVariable(RplSymbolSpace* symbolSpace,
                                           int variableNo)
 {
     RplASVariant& rc = *m_valueStack[0];
+    int ix = m_topOfFrames;
+    RplStackFrame* frame = NULL;
+    for(int ix = m_topOfFrames; ix >= 0; ix--){
+        frame = m_frameStack[ix];
+        if (frame->symbols() == symbolSpace){
+            rc = frame->valueOfVariable(variableNo);
+            break;
+        }
+    }
+    if (frame == NULL)
+        m_logger->logv(LOG_ERROR, LOC_VAL_OF_VAR_1, "no frame has symbolspace %s",
+                      symbolSpace->name().toUtf8().constData());
 
     return rc;
 }
@@ -365,4 +400,13 @@ void RplVirtualMachine::setTraceWriter(RplWriter* traceWriter)
 {
     m_traceWriter = traceWriter;
 }
+/**
+ * @brief Returns the abstract symbol tree.
+ *
+ * @return  the abstract symbol tree
+ */
+RplASTree& RplVirtualMachine::tree() const
+{
+    return m_tree;
+}
 
index c9c9d8429654303f07221bf2ce44663bebb25b01..c86ed4836e2cb146f1566fa0b0d12584916cd153 100644 (file)
@@ -20,6 +20,8 @@ public:
     ~RplStackFrame();
 public:
     RplASVariant& valueOfVariable(int index);
+    RplSymbolSpace* symbols() const;
+
 private:
     int m_countVariables;
     RplASVariant* m_variables;
@@ -54,7 +56,8 @@ protected:
     bool m_debugMode;
     bool m_singleStep;
     int m_maxStack;
-    StackFrameList m_stack;
+    StackFrameList m_frameStack;
+    int m_topOfFrames;
     QList<RplASVariant*> m_valueStack;
     int m_topOfValues;
     RplVirtualMachine* m_vm;
@@ -86,6 +89,7 @@ public:
     void setFlag(VMFlag flag);
     void clearFlag(VMFlag flag);
     void setTraceWriter(RplWriter* traceWriter);
+    RplASTree& tree() const;
 
 private:
     int m_maxStack;
index 9bfcb7ea6ca6df138a4dee080ff335862ec55eed..86ff3b914dcb3d1d5da06741ba040acabc2be0ce 100644 (file)
@@ -2,25 +2,25 @@
 #define RPLMODULES_HPP
 
 enum {
-    RPLMODULE_LOGGER = 1,
+    RPLMODULE_LOGGER = 101,
     RPLMODULE_CONFIG,
     RPLMODULE_CONTAINER,
     RPLMODULE_EXCEPTION,
-    RPLMODULE_TEST, // 5
+    RPLMODULE_TEST, // 105
     RPLMODULE_TCPSERVER,
     RPLMODULE_TCPCLIENT,
     RPLMODULE_TCPPEER,
     RPLMODULE_TERMINATOR,
-    RPL_MODULE_ASTREE, // 10
+    RPL_MODULE_ASTREE, // 110
     RPL_MODULE_ASCLASSES,
     RPL_MODULE_LEXER,
     RPL_MODULE_SOURCE,
-    RPL_MODULE_ASVM,
-    RPL_MODULE_MFPARSER, // 15
+    RPL_MODULE_VM,
+    RPL_MODULE_MFPARSER, // 115
     // last element:
     RPLMODULE_COUNT
 };
-#define RPL_FIRST_OF(moduleNo) (moduleNo*1000+1)
+#define RPL_FIRST_OF(moduleNo) (moduleNo*100+1)
 class RplModules{
 public:
     static int fileToNumber(const char* file);
index b78c121bd7c77669a0cabaefde286f804182525e..7ae57df59a84b774863d9d77fbb7422736f83982 100644 (file)
@@ -8,7 +8,7 @@
 #include "rplnet.hpp"
 
 enum {
-    LOC_1 = RPL_FIRST_OF(RPLMODULE_TCPCLIENT), // 701
+    LOC_1 = RPL_FIRST_OF(RPLMODULE_TCPCLIENT), // 10701
     LOC_HANDLE_ERROR_1,
     LOC_SET_REMOTE_ADDRESS_1,
 };
index 743de3114466b5012dd3c33d57a266284d7a721f..d45946f232323721237dee3e32d1cec9fe9ab673 100644 (file)
@@ -8,7 +8,7 @@
 #include "rplnet.hpp"
 
 enum {
-    LOC_SEND_1 = RPL_FIRST_OF(RPLMODULE_TCPPEER), // 801
+    LOC_SEND_1 = RPL_FIRST_OF(RPLMODULE_TCPPEER), // 10801
     LOC_READ_BYTES_1,
     LOC_READ_BYTES_2,
     LOC_READ_BYTES_3,
index 25cc44e0161198f420f3d271b5c27d89aed23e7e..c9ba87faacf1da66c1bbfbf95ce981ef8db1aae4 100644 (file)
@@ -8,7 +8,7 @@
 #include "rplnet.hpp"
 
 enum {
-    LOC_RUN_1 = RPL_FIRST_OF(RPLMODULE_TCPSERVER), // 601
+    LOC_RUN_1 = RPL_FIRST_OF(RPLMODULE_TCPSERVER), // 10601
     LOC_TCP_TREAD_RUN_1,
     LOC_TCP_TREAD_RUN_2,
     LOC_TCP_INCOMING_CONNECTION_1,