Exps: add an equal method 12/16112/3
Calixte DENIZET [Mon, 9 Mar 2015 09:23:42 +0000 (10:23 +0100)]
Change-Id: I82553dce934d92231266d2af49c38c3966bfd97d

46 files changed:
scilab/modules/ast/includes/analysis/AnalysisVisitor.hxx
scilab/modules/ast/includes/exps/arraylistexp.hxx
scilab/modules/ast/includes/exps/arraylistvar.hxx
scilab/modules/ast/includes/exps/assignexp.hxx
scilab/modules/ast/includes/exps/assignlistexp.hxx
scilab/modules/ast/includes/exps/boolexp.hxx
scilab/modules/ast/includes/exps/breakexp.hxx
scilab/modules/ast/includes/exps/callexp.hxx
scilab/modules/ast/includes/exps/caseexp.hxx
scilab/modules/ast/includes/exps/cellcallexp.hxx
scilab/modules/ast/includes/exps/cellexp.hxx
scilab/modules/ast/includes/exps/colonvar.hxx
scilab/modules/ast/includes/exps/commentexp.hxx
scilab/modules/ast/includes/exps/constexp.hxx
scilab/modules/ast/includes/exps/continueexp.hxx
scilab/modules/ast/includes/exps/daxpyexp.hxx
scilab/modules/ast/includes/exps/dollarvar.hxx
scilab/modules/ast/includes/exps/doubleexp.hxx
scilab/modules/ast/includes/exps/exp.hxx
scilab/modules/ast/includes/exps/fieldexp.hxx
scilab/modules/ast/includes/exps/forexp.hxx
scilab/modules/ast/includes/exps/functiondec.hxx
scilab/modules/ast/includes/exps/ifexp.hxx
scilab/modules/ast/includes/exps/listexp.hxx
scilab/modules/ast/includes/exps/logicalopexp.hxx
scilab/modules/ast/includes/exps/matrixexp.hxx
scilab/modules/ast/includes/exps/matrixlineexp.hxx
scilab/modules/ast/includes/exps/nilexp.hxx
scilab/modules/ast/includes/exps/notexp.hxx
scilab/modules/ast/includes/exps/opexp.hxx
scilab/modules/ast/includes/exps/optimizedexp.hxx
scilab/modules/ast/includes/exps/returnexp.hxx
scilab/modules/ast/includes/exps/selectexp.hxx
scilab/modules/ast/includes/exps/seqexp.hxx
scilab/modules/ast/includes/exps/simplevar.hxx
scilab/modules/ast/includes/exps/stringexp.hxx
scilab/modules/ast/includes/exps/transposeexp.hxx
scilab/modules/ast/includes/exps/trycatchexp.hxx
scilab/modules/ast/includes/exps/vardec.hxx
scilab/modules/ast/includes/exps/whileexp.hxx
scilab/modules/ast/includes/types/matrixiterator.hxx
scilab/modules/ast/src/cpp/ast/debugvisitor.cpp
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/src/cpp/parse/bison/parsescilab.yy
scilab/modules/ast/src/cpp/parse/parsescilab.cpp
scilab/modules/functions/sci_gateway/cpp/sci_execstr.cpp

index dcca0e5..99f310a 100644 (file)
@@ -384,13 +384,6 @@ private:
         switch (e.getOper())
         {
             case ast::OpExp::plus :
-            {
-                if (replaceDAXPY(e))
-                {
-                    return;
-                }
-                //continue in generic case
-            }
             case ast::OpExp::minus :
             case ast::OpExp::dottimes :
             {
@@ -430,6 +423,38 @@ private:
             ast::SimpleVar & var = static_cast<ast::SimpleVar &>(e.getLeftExp());
             symbol::Symbol sym = var.getSymbol();
 
+            if (e.getRightExp().isOpExp())
+            {
+                ast::OpExp * oe = e.getRightExp().getAs<ast::OpExp>();
+                if (oe->getOper() == ast::OpExp::plus)
+                {
+                    ast::Exp& le = oe->getLeft();
+                    ast::Exp& re = oe->getRight();
+                    if (le.isSimpleVar() && re.isOpExp())
+                    {
+                        ast::OpExp * _oe = re.getAs<ast::OpExp>();
+                        if (static_cast<ast::SimpleVar &>(le).getSymbol() == sym && _oe->getOper() == ast::OpExp::times)
+                        {
+                            ast::Exp* exp = new ast::DAXPYExp(e.getLocation(), _oe->getLeft(), _oe->getRight(), var);
+                            exp->setVerbose(e.isVerbose());
+                            exp->getDecorator().res = e.getDecorator().res;
+                            e.replace(exp);
+                        }
+                    }
+                    else if (re.isSimpleVar() && le.isOpExp())
+                    {
+                        ast::OpExp * _oe = le.getAs<ast::OpExp>();
+                        if (static_cast<ast::SimpleVar &>(re).getSymbol() == sym && _oe->getOper() == ast::OpExp::times)
+                        {
+                            ast::Exp* exp = new ast::DAXPYExp(e.getLocation(), _oe->getLeft(), _oe->getRight(), var);
+                            exp->setVerbose(e.isVerbose());
+                            exp->getDecorator().res = e.getDecorator().res;
+                            e.replace(exp);
+                        }
+                    }
+                }
+            }
+
             e.getRightExp().accept(*this);
             var.getDecorator().res = getResult();
 
@@ -676,14 +701,14 @@ private:
             if (le.isOpExp() && le.getAs<ast::OpExp>()->getOper() == ast::OpExp::dottimes)
             {
                 ast::OpExp* dt = le.getAs<ast::OpExp>();
-                y = &le;
+                y = &re;
                 a = &dt->getLeft();
                 x = &dt->getRight();
             }
             else if (re.isOpExp() && re.getAs<ast::OpExp>()->getOper() == ast::OpExp::dottimes)
             {
                 ast::OpExp* rt = re.getAs<ast::OpExp>();
-                y = &re;
+                y = &le;
                 a = &rt->getLeft();
                 x = &rt->getRight();
             }
index 981d4b8..877432f 100644 (file)
@@ -91,7 +91,7 @@ public:
     /** \} */
 
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return ARRAYLISTEXP;
     }
index aff6458..5f2331e 100644 (file)
@@ -91,7 +91,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return ARRAYLISTVAR;
     }
index 64951e1..c48a416 100644 (file)
@@ -115,7 +115,7 @@ public:
 
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return ASSIGNEXP;
     }
index 6d27407..1f82970 100644 (file)
@@ -68,7 +68,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return ASSIGNLISTEXP;
     }
index 902e232..a0a15fb 100644 (file)
@@ -52,6 +52,11 @@ public:
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == BOOLEXP && _value == static_cast<const BoolExp &>(e)._value;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -77,7 +82,7 @@ public:
         return _value;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return BOOLEXP;
     }
index 80eb3a6..34c4c19 100644 (file)
@@ -59,7 +59,7 @@ public:
         v.visit (*this);
     }
     /** \} */
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return BREAKEXP;
     }
index 027ca35..175bf0d 100644 (file)
@@ -129,7 +129,7 @@ public:
         _exps.push_back(exp);
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return CALLEXP;
     }
index 21fe7a7..a5503e5 100644 (file)
@@ -68,7 +68,7 @@ public :
         return _exps[1];
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return CASEEXP;
     }
index bdb8b36..858ee41 100644 (file)
@@ -73,7 +73,7 @@ public:
 
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return CELLCALLEXP;
     }
index 84c0d4a..07d769b 100644 (file)
@@ -71,7 +71,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return CELLEXP;
     }
index 522f14b..d91e093 100644 (file)
@@ -48,6 +48,11 @@ public:
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == COLONVAR;
+    }
+
     /** \brief Accept a const visitor \a v. */
     virtual void accept (Visitor& v)
     {
@@ -59,7 +64,7 @@ public:
         v.visit (*this);
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return COLONVAR;
     }
index ee79524..fd5db4e 100644 (file)
@@ -45,6 +45,11 @@ public:
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == COMMENTEXP;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -71,7 +76,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return COMMENTEXP;
     }
index 423a6dc..66435c1 100644 (file)
@@ -65,6 +65,17 @@ public:
         constant->IncreaseRef();
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        // TODO : check for the equality of the contents of constant
+        return e.getType() == CONSTEXP && *constant == *static_cast<const ConstExp &>(e).constant;
+    }
+
+    virtual ExpType getType() const
+    {
+        return CONSTEXP;
+    }
+
 protected :
     types::InternalType* constant;
 };
index 74731eb..d969105 100644 (file)
@@ -59,7 +59,7 @@ public:
         v.visit (*this);
     }
     /** \} */
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return CONTINUEEXP;
     }
index 10ec186..315153c 100644 (file)
@@ -85,6 +85,11 @@ public:
         return *_exps[2];
     }
 
+    virtual ExpType getType() const
+    {
+        return DAXPYEXP;
+    }
+
 };
 } // namespace ast
 #endif /* !AST_DAXPYEXP_HXX */
index 96b8fb2..89cc401 100644 (file)
@@ -49,6 +49,11 @@ public:
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == DOLLARVAR;
+    }
+
     /** \brief Accept a const visitor \a v. */
     virtual void accept (Visitor& v)
     {
@@ -60,7 +65,7 @@ public:
         v.visit (*this);
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return DOLLARVAR;
     }
index 2f334b3..5da6ef0 100644 (file)
@@ -51,6 +51,12 @@ public:
         cloned->setVerbose(isVerbose());
         return cloned;
     }
+
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == DOUBLEEXP && _value == static_cast<const DoubleExp &>(e)._value;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -77,7 +83,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return DOUBLEEXP;
     }
index 5114353..a7ec6d8 100644 (file)
@@ -72,6 +72,32 @@ public:
 
     virtual Exp* clone() = 0;
 
+    virtual bool equal(const Exp & e) const
+    {
+        if (getType() == e.getType() && _exps.size() == e._exps.size())
+        {
+            for (exps_t::const_iterator i = _exps.begin(), j = e._exps.begin(), _e = _exps.end(); i != _e; ++i, ++j)
+            {
+                if (!(*i)->equal(**j))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    inline bool operator==(const Exp & R) const
+    {
+        return equal(R);
+    }
+
+    inline bool operator!=(const Exp & R) const
+    {
+        return !equal(R);
+    }
+
 public:
     /** \brief Return if an expression should be displayed or not. */
     inline void mute(void)
@@ -220,10 +246,11 @@ public:
         VARDEC,
         FUNCTIONDEC,
         LISTEXP,
-        OPTIMIZEDEXP
+        OPTIMIZEDEXP,
+        DAXPYEXP
     };
 
-    virtual ExpType getType() = 0;
+    virtual ExpType getType() const = 0;
 
     template <class T>
     inline T* getAs(void)
index e534a58..7e9b602 100644 (file)
@@ -111,7 +111,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return FIELDEXP;
     }
index dbb0e84..17caaf7 100644 (file)
@@ -108,7 +108,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return FOREXP;
     }
index b472cc7..8258123 100644 (file)
@@ -77,6 +77,11 @@ public:
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return Exp::equal(e) && _name == static_cast<const FunctionDec &>(e)._name;
+    }
+
     // \name Visitors entry point.
 public:
     // \brief Accept a const visitor
@@ -143,7 +148,7 @@ public:
         return _stack;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return FUNCTIONDEC;
     }
index 03aba98..a135bd6 100644 (file)
@@ -128,7 +128,7 @@ public:
         return _hasElse;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return IFEXP;
     }
index 3370621..6f66ccf 100644 (file)
@@ -146,7 +146,7 @@ public:
     }
 
     /** \} */
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return LISTEXP;
     }
index 14c964f..d0c2b69 100644 (file)
@@ -81,7 +81,7 @@ public:
         _oper = oper;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return LOGICALOPEXP;
     }
index 679452c..1d2ba34 100644 (file)
@@ -97,7 +97,7 @@ public:
     /** \} */
 
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return MATRIXEXP;
     }
index 9b86d05..5b41b88 100644 (file)
@@ -96,7 +96,7 @@ public:
     /** \} */
 
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return MATRIXLINEEXP;
     }
index 0b83d84..75941af 100644 (file)
@@ -38,6 +38,12 @@ public:
         cloned->setVerbose(isVerbose());
         return cloned;
     }
+
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == NILEXP;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -53,7 +59,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return NILEXP;
     }
index 4bedbea..9a4d92a 100644 (file)
@@ -85,7 +85,7 @@ public:
         return *_exps[0];
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return NOTEXP;
     }
index 7967491..cfe0f7f 100644 (file)
@@ -174,7 +174,7 @@ public:
         return *_exps[1];
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return OPEXP;
     }
index bae017c..5e976e4 100644 (file)
@@ -29,7 +29,7 @@ public:
     {
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return OPTIMIZEDEXP;
     }
index f094ea3..b2fca01 100644 (file)
@@ -106,7 +106,7 @@ public:
         return _is_global;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return RETURNEXP;
     }
index 1302ba5..dce34b1 100644 (file)
@@ -45,16 +45,8 @@ public :
         }
 
         delete &cases;
-
-        if (&defaultCase != NULL)
-        {
-            defaultCase.setParent(this);
-            _exps.push_back(&defaultCase);
-        }
-        else
-        {
-            _hasDefault = false;
-        }
+        defaultCase.setParent(this);
+        _exps.push_back(&defaultCase);
     }
 
     SelectExp(const Location& location,
@@ -108,6 +100,11 @@ public :
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return Exp::equal(e) && hasDefault() == static_cast<const SelectExp &>(e).hasDefault();
+    }
+
 public :
     Exp* getSelect() const
     {
@@ -159,7 +156,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return SELECTEXP;
     }
index 719cc1d..f086c69 100644 (file)
@@ -102,7 +102,7 @@ public:
     /** \} */
 
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return SEQEXP;
     }
index bb31145..e04440a 100644 (file)
@@ -52,6 +52,11 @@ public:
         return cloned;
     }
 
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == SIMPLEVAR && _name == static_cast<const SimpleVar &>(e)._name;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -95,7 +100,7 @@ public:
     }
 
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return SIMPLEVAR;
     }
index bbce8a5..859e753 100644 (file)
@@ -23,7 +23,7 @@ namespace ast
 class StringExp : public ConstExp
 {
 public:
-    StringExp (const Location& location, std::wstring value)
+    StringExp (const Location& location, const std::wstring & value)
         : ConstExp (location),
           _value (value)
     {
@@ -50,6 +50,12 @@ public:
         cloned->setVerbose(isVerbose());
         return cloned;
     }
+
+    virtual bool equal(const Exp & e) const
+    {
+        return e.getType() == STRINGEXP && _value == static_cast<const StringExp &>(e)._value;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -73,7 +79,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return STRINGEXP;
     }
index 393cd35..549fb22 100644 (file)
@@ -99,7 +99,7 @@ public:
         return _conjugate;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return TRANSPOSEEXP;
     }
index c97a239..ec001aa 100644 (file)
@@ -97,7 +97,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return TRYCATCHEXP;
     }
index 7620d84..2119ca7 100644 (file)
@@ -71,6 +71,12 @@ public:
         cloned->setVerbose(isVerbose());
         return cloned;
     }
+
+    virtual bool equal(const Exp & e) const
+    {
+        return Exp::equal(e) && _name == static_cast<const VarDec &>(e)._name;
+    }
+
     /** \name Visitors entry point.
     ** \{ */
 public:
@@ -137,7 +143,7 @@ public:
         list_info = _list_info;
     }
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return VARDEC;
     }
index 0000924..c534519 100644 (file)
@@ -106,7 +106,7 @@ public:
     }
     /** \} */
 
-    virtual ExpType getType()
+    virtual ExpType getType() const
     {
         return WHILEEXP;
     }
index 31d0134..3525328 100644 (file)
@@ -209,44 +209,44 @@ template<> bool set(types::SparseBool::BoolSparse_t& s, int r, int c, bool v)
 
 
 
-template<typename S> int rows(S SPARSE_CONST&s)
+template<typename S> inline int rows(S SPARSE_CONST&s)
 {
     return s.rows();
 }
-template<typename S> int cols(S SPARSE_CONST&s)
+template<typename S> inline int cols(S SPARSE_CONST&s)
 {
     return s.cols();
 }
 
-template<> int rows(types::Double SPARSE_CONST&d)
+template<> inline int rows(types::Double SPARSE_CONST&d)
 {
     return d.getRows();
 }
-template<> int cols(types::Double SPARSE_CONST&d)
+template<> inline int cols(types::Double SPARSE_CONST&d)
 {
     return d.getCols();
 }
-template<> int rows(types::Sparse SPARSE_CONST&s)
+template<> inline int rows(types::Sparse SPARSE_CONST&s)
 {
     return s.getRows();
 }
-template<> int cols(types::Sparse SPARSE_CONST&s)
+template<> inline int cols(types::Sparse SPARSE_CONST&s)
 {
     return s.getCols();
 }
-template<> int rows(types::Bool SPARSE_CONST&s)
+template<> inline int rows(types::Bool SPARSE_CONST&s)
 {
     return s.getRows();
 }
-template<> int cols(types::Bool SPARSE_CONST&s)
+template<> inline int cols(types::Bool SPARSE_CONST&s)
 {
     return s.getCols();
 }
-template<> int rows(types::SparseBool SPARSE_CONST&s)
+template<> inline int rows(types::SparseBool SPARSE_CONST&s)
 {
     return s.getRows();
 }
-template<> int cols(types::SparseBool SPARSE_CONST&s)
+template<> inline int cols(types::SparseBool SPARSE_CONST&s)
 {
     return s.getCols();
 }
index 7db80f9..6181781 100644 (file)
@@ -427,7 +427,14 @@ void DebugVisitor::visit(const OptimizedExp &e)
 
 void DebugVisitor::visit(const DAXPYExp &e)
 {
-    e.getOriginal()->accept(*this);
+    DEBUG_START_NODE(e);
+    DEBUG(L"Exec DAXPYExp", e);
+    e.getA().accept (*this);
+    e.getX().accept (*this);
+    e.getY().accept (*this);
+    DEBUG_END_NODE();
+
+    //e.getOriginal()->accept(*this);
 }
 
 }
index dbb812a..05c8ab6 100644 (file)
@@ -1387,10 +1387,10 @@ void RunVisitorT<T>::visitprivate(const DAXPYExp &e)
         {
             //a is a and it must be scalar
             ad = pIT->getAs<Double>();
-            if (ad->isScalar() && ad->isComplex() == false)
+            if (/*ad->isScalar() && */ad->isComplex() == false)
             {
-                ar = 1;
-                ac = 1;
+                ar = ad->getRows(); //1;
+                ac = ad->getCols();//1;
             }
             else
             {
@@ -1421,10 +1421,19 @@ void RunVisitorT<T>::visitprivate(const DAXPYExp &e)
             //go !
             int one = 1;
             int size = xc * xr;
-            Double* od = (Double*)yd->clone();
-            C2F(daxpy)(&size, ad->get(), xd->get(), &one, od->get(), &one);
-            setResult(od);
-            yd->killMe();
+            //Double* od = (Double*)yd->clone();
+            C2F(daxpy)(&size, ad->get(), xd->get(), &one, yd->get(), &one);
+            //setResult(od);
+            //yd->killMe();
+            xd->killMe();
+            ad->killMe();
+            return;
+        }
+        else if (ac == xr && ar == yr && xc == yc)
+        {
+            char n = 'n';
+            double one = 1;
+            C2F(dgemm)(&n, &n, &ar, &xc, &ac, &one, ad->get(), &ar, xd->get(), &ac, &one, yd->get(), &ar);
             xd->killMe();
             ad->killMe();
             return;
index 97abd84..b47c809 100644 (file)
@@ -1488,9 +1488,28 @@ ELSEIF condition then thenBody                                           {
 /* Select Case Then End control block */
 selectControl :
 select selectable selectConditionBreak casesControl END                                                                        { $$ = new ast::SelectExp(@$, *$2, *$4); }
-| select selectable selectConditionBreak casesControl defaultCase elseBody END                 { $$ = new ast::SelectExp(@$, *$2, *$4, *$6); }
+| select selectable selectConditionBreak casesControl defaultCase elseBody END                 {
+                                        if($6 == NULL)
+                                        {
+                                            $$ = new ast::SelectExp(@$, *$2, *$4);
+                                        }
+                                        else
+                                        {
+                                            $$ = new ast::SelectExp(@$, *$2, *$4, *$6);
+                                        }
+                                    }
 | select selectable COMMENT selectConditionBreak casesControl END                                              { $$ = new ast::SelectExp(@$, *$2, *$5); delete $3;}
-| select selectable COMMENT selectConditionBreak casesControl defaultCase elseBody END { $$ = new ast::SelectExp(@$, *$2, *$5, *$7); delete $3;}
+| select selectable COMMENT selectConditionBreak casesControl defaultCase elseBody END {
+                                        if($7 == NULL)
+                                        {
+                                            $$ = new ast::SelectExp(@$, *$2, *$5);
+                                        }
+                                        else
+                                        {
+                                            $$ = new ast::SelectExp(@$, *$2, *$5, *$7);
+                                        }
+                                        delete $3;
+                                    }
 ;
 
 /*
index 0ab2057..fa32471 100644 (file)
@@ -738,18 +738,18 @@ static const yytype_uint16 yyrline[] =
     1342,  1343,  1344,  1349,  1350,  1351,  1352,  1359,  1368,  1369,
     1379,  1387,  1388,  1402,  1403,  1419,  1420,  1421,  1422,  1423,
     1431,  1432,  1433,  1434,  1435,  1436,  1444,  1445,  1446,  1447,
-    1448,  1449,  1457,  1462,  1475,  1490,  1491,  1492,  1493,  1501,
-    1502,  1510,  1511,  1512,  1513,  1514,  1515,  1516,  1524,  1525,
-    1533,  1534,  1535,  1536,  1537,  1545,  1549,  1553,  1557,  1561,
-    1565,  1572,  1573,  1587,  1588,  1589,  1590,  1591,  1592,  1593,
-    1594,  1595,  1596,  1597,  1598,  1606,  1607,  1615,  1616,  1625,
-    1626,  1627,  1628,  1629,  1630,  1631,  1632,  1636,  1637,  1651,
-    1659,  1660,  1674,  1675,  1676,  1677,  1678,  1679,  1680,  1681,
-    1682,  1683,  1684,  1685,  1686,  1687,  1688,  1689,  1690,  1691,
-    1699,  1700,  1714,  1715,  1716,  1717,  1718,  1725,  1739,  1740,
-    1741,  1748,  1749,  1757,  1758,  1766,  1767,  1768,  1769,  1770,
-    1771,  1772,  1773,  1774,  1775,  1776,  1777,  1778,  1779,  1780,
-    1781,  1782,  1783,  1784,  1785
+    1448,  1449,  1457,  1462,  1475,  1490,  1491,  1501,  1502,  1520,
+    1521,  1529,  1530,  1531,  1532,  1533,  1534,  1535,  1543,  1544,
+    1552,  1553,  1554,  1555,  1556,  1564,  1568,  1572,  1576,  1580,
+    1584,  1591,  1592,  1606,  1607,  1608,  1609,  1610,  1611,  1612,
+    1613,  1614,  1615,  1616,  1617,  1625,  1626,  1634,  1635,  1644,
+    1645,  1646,  1647,  1648,  1649,  1650,  1651,  1655,  1656,  1670,
+    1678,  1679,  1693,  1694,  1695,  1696,  1697,  1698,  1699,  1700,
+    1701,  1702,  1703,  1704,  1705,  1706,  1707,  1708,  1709,  1710,
+    1718,  1719,  1733,  1734,  1735,  1736,  1737,  1744,  1758,  1759,
+    1760,  1767,  1768,  1776,  1777,  1785,  1786,  1787,  1788,  1789,
+    1790,  1791,  1792,  1793,  1794,  1795,  1796,  1797,  1798,  1799,
+    1800,  1801,  1802,  1803,  1804
 };
 #endif
 
@@ -5017,7 +5017,16 @@ yyreduce:
 
   case 306:
 
-    { (yyval.t_select_exp) = new ast::SelectExp((yyloc), *(yyvsp[-5].t_exp), *(yyvsp[-3].t_list_case), *(yyvsp[-1].t_seq_exp)); }
+    {
+                                        if((yyvsp[-1].t_seq_exp) == NULL)
+                                        {
+                                            (yyval.t_select_exp) = new ast::SelectExp((yyloc), *(yyvsp[-5].t_exp), *(yyvsp[-3].t_list_case));
+                                        }
+                                        else
+                                        {
+                                            (yyval.t_select_exp) = new ast::SelectExp((yyloc), *(yyvsp[-5].t_exp), *(yyvsp[-3].t_list_case), *(yyvsp[-1].t_seq_exp));
+                                        }
+                                    }
 
     break;
 
@@ -5029,7 +5038,17 @@ yyreduce:
 
   case 308:
 
-    { (yyval.t_select_exp) = new ast::SelectExp((yyloc), *(yyvsp[-6].t_exp), *(yyvsp[-3].t_list_case), *(yyvsp[-1].t_seq_exp)); delete (yyvsp[-5].comment);}
+    {
+                                        if((yyvsp[-1].t_seq_exp) == NULL)
+                                        {
+                                            (yyval.t_select_exp) = new ast::SelectExp((yyloc), *(yyvsp[-6].t_exp), *(yyvsp[-3].t_list_case));
+                                        }
+                                        else
+                                        {
+                                            (yyval.t_select_exp) = new ast::SelectExp((yyloc), *(yyvsp[-6].t_exp), *(yyvsp[-3].t_list_case), *(yyvsp[-1].t_seq_exp));
+                                        }
+                                        delete (yyvsp[-5].comment);
+                                    }
 
     break;
 
index e05009e..0f197b7 100644 (file)
@@ -13,6 +13,7 @@
 #include <string.h>
 #include "parser.hxx"
 #include "functions_gw.hxx"
+//#include "debugvisitor.hxx"
 #include "execvisitor.hxx"
 #include "mutevisitor.hxx"
 #include "printvisitor.hxx"
@@ -197,6 +198,8 @@ Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount, types::
     {
         analysis::AnalysisVisitor analysis;
         pExp->accept(analysis);
+        //ast::DebugVisitor debugMe;
+        //pExp->accept(debugMe);
     }
 
     ast::exps_t LExp = pExp->getAs<SeqExp>()->getExps();