void CParser::ParamList() { int args = 0; mIsFormula = true; while (mLookahead != ')') { if (mLookahead != LIST) RelExpr(); else AddToken(valNil); if (mLookahead != ')') Match(LIST); args++; } mArgCnt = args; } // CParser::ParamList
bool CParser::Parse(const char *inString, cell inLocation) { // fprintf( stderr, "CParser::Parse( \"%s\", [ %hd , %hd ] )\n", // inString , inLocation.h , inLocation.v ) ; mLoc = inLocation; mExpr = mExprStart = inString; mOffset = 0; bool result = true; try { mTokenStart = mExpr; mLookahead = GetNextToken(true); if (mLookahead == RELOP && mRelop == opEQ) { Match(RELOP); mIsFormula = true; } else mIsFormula = false; RelExpr(); Match(END); AddToken(opEnd); } catch (CErr& e) { if (mIsFormula) throw; result = false; } return result; } // CParser::Parse
void CParser::Factor() { switch (mLookahead) { case '-': Match('-'); Factor(); AddToken(opNegate); break; case NUMBER: { double d = mNum; Match(NUMBER); if (mLookahead == '%') { Match('%'); AddToken(valPerc, &d); } else AddToken(valNum, &d); break; } case '(': Match('('); RelExpr(); Match(')'); AddToken(opParen); break; case CELL: { range r; r.TopLeft() = mCell; Match(CELL); mIsFormula = true; if (mLookahead == RANGE) { Match(RANGE); r.BotRight() = mCell; Match(CELL); AddToken(valRange, &r); } else AddToken(valCell, &r.TopLeft()); break; } case IDENT: { char name[256]; strcpy(name, mToken); int s = mTokenStart - mExprStart; FuncCallData fcd; fcd.funcNr = GetFunctionNr(name); int expectedArgs = gFuncArrayByNr[fcd.funcNr].argCnt; Match(IDENT); if (mLookahead == '(') { Match('('); ParamList(); Match(')'); if (fcd.funcNr < 0) throw CParseErr(s, strlen(name), errUnknownFunction, name); if (expectedArgs == -1 || expectedArgs == mArgCnt || (expectedArgs < 0 || expectedArgs <= -fcd.funcNr)) { fcd.argCnt = mArgCnt; } else if (expectedArgs < 0) throw CParseErr(s, strlen(name), errIncorrectNrOfArgs2, expectedArgs, mArgCnt); else throw CParseErr(s, strlen(name), errIncorrectNrOfArgs, expectedArgs, mArgCnt); AddToken(opFunc, &fcd); } else { if (fcd.funcNr >= 0) { if (expectedArgs != -1 && expectedArgs != 0) throw CParseErr(s, strlen(name), errIncorrectNrOfArgs, expectedArgs, 0); fcd.argCnt = 0; AddToken(opFunc, &fcd); } else if (mContainer && mContainer->GetOwner() && mContainer->GetOwner()->IsNamedRange(name)) { AddToken(valName, name); } else throw CParseErr(s, strlen(name), errUnknownIdentifier, name); } break; } case TEXT: AddToken(valStr, mToken); Match(TEXT); break; case TIME: AddToken(valTime, &mTime); Match(TIME); break; case BOOL: AddToken(valBool, &mBool); Match(BOOL); break; default: Match(NUMBER); } } // CParser::Factor
void BRTKernelDef::PrintVoutPostfix(std::ostream & out) const{ out << " __vout_counter+=1.0f;"<<std::endl; FunctionType* ft = static_cast<FunctionType*>(decl->form); std::set<unsigned int >::iterator beginvout = voutFunctions[FunctionName()->name].begin(); std::set<unsigned int >::iterator endvout = voutFunctions[FunctionName()->name].end(); std::set<unsigned int >::iterator iter; std::set<unsigned int >::iterator inneriter; bool limited_vout=false; bool allone=true; unsigned int limited_vout_counter=0; unsigned int numlimits=0; for (iter = beginvout;iter!=endvout;++iter) { Decl * decl = ft->args[*iter]; Expression * vout_limit = decl->form->getQualifiers().vout; if (vout_limit) { bool filter=isFilter(vout_limit); allone=(allone&&filter); if (limited_vout||beginvout==iter) { limited_vout=true; numlimits++; } else limited_vout=false; } } if (numlimits>1&&!allone){ numlimits=0; limited_vout=false; } for (iter = beginvout;iter!=endvout;++iter) { Decl * decl = ft->args[*iter]; Expression * vout_limit = decl->form->getQualifiers().vout; if (vout_limit&&limited_vout) { if (limited_vout_counter==0) out << " if ("; bool useparen=(vout_limit->precedence() < RelExpr(RO_Less, NULL, NULL, vout_limit->location).precedence()); // the above is a simple check for the common expressions. // no need to get fancy here for parens are ok in this case. out <<"(__vout_counter >= "; if (useparen) out << "("; vout_limit->print(out); if (useparen) out << ")"; out << ")"; limited_vout_counter++; if (limited_vout_counter==numlimits) { out <<") {"<<std::endl; for (inneriter = beginvout;inneriter!=endvout;++inneriter) { Decl * decl = ft->args[*inneriter]; out <<" "; out <<getDeclStream(decl,"_outputs")<<".push_back(0);"<<std::endl; } out <<" "; out <<"break;"<<std::endl; out <<" }"<<std::endl; }else { out << "&&"; } }else { out << " "<<getDeclStream(decl,"_values")<< " = "; out << "("; out << decl->name->name<<"->getDimension()==2?"; out << "finiteValueProduced"<<getDimensionString(2)<<undecoratedBase(decl); out << ":finiteValueProduced"<<getDimensionString(1); out << undecoratedBase(decl)<<")(*"<<getDeclStream(decl,"_outputs"); out << ".back())?1:0;"<<std::endl; } } out << " }"<<std::endl; for (iter = beginvout;iter!=endvout;++iter) { Decl * decl = ft->args[*iter]; out << " if ("<<decl->name->name<<"->getDimension()==2) {"<<std::endl; PrintVoutDimensionalShift(out,decl,2); out << " }else {"<<std::endl; PrintVoutDimensionalShift(out,decl,1); out << " }"<<std::endl; out << " while ("<<getDeclStream(decl,"_outputs")<<".size()) {"; out << std::endl; out << " if ("<<getDeclStream(decl,"_outputs")<<".back())"<<std::endl; out << " delete "<<getDeclStream(decl,"_outputs")<<".back();"; out << std::endl; out << " "<<getDeclStream(decl,"_outputs")<<".pop_back();"<<std::endl; out << " }"<<std::endl; } }