diff --git a/components/compiler/exprparser.cpp b/components/compiler/exprparser.cpp index e780fdd31c..e2b68f70f2 100644 --- a/components/compiler/exprparser.cpp +++ b/components/compiler/exprparser.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "generator.hpp" #include "scanner.hpp" @@ -51,6 +52,11 @@ namespace Compiler return mOperators[mOperators.size()-1]; } + bool ExprParser::isOpen() const + { + return std::find (mOperators.begin(), mOperators.end(), '(')!=mOperators.end(); + } + void ExprParser::popOperator() { assert (!mOperators.empty()); @@ -293,8 +299,15 @@ namespace Compiler if (code==Scanner::S_close && !mNextOperand) { - close(); - return true; + if (isOpen()) + { + close(); + return true; + } + + mTokenLoc = loc; + scanner.putbackSpecial (code, loc); + return false; } if (!mNextOperand) diff --git a/components/compiler/exprparser.hpp b/components/compiler/exprparser.hpp index 14c530010d..47b2151bb8 100644 --- a/components/compiler/exprparser.hpp +++ b/components/compiler/exprparser.hpp @@ -30,6 +30,8 @@ namespace Compiler char getOperator() const; + bool isOpen() const; + void popOperator(); void popOperand();