bool Compiler2Pass::ValidateToken(const uint rulepathIDX, const uint activeRuleID) { int tokenlength = 0; // assume the test is going to fail bool Passed = false; uint TokenID = mRootRulePath[rulepathIDX].mTokenID; // only validate token if context is correct if (mSymbolTypeLib[TokenID].mContextKey & mActiveContexts) { // if terminal token then compare text of symbol with what is in source if ( mSymbolTypeLib[TokenID].mRuleID == 0){ if (positionToNextSymbol()) { // if Token is supposed to be a number then check if its a numerical constant if (TokenID == mValueID) { float constantvalue; if(Passed = isFloatValue(constantvalue, tokenlength)) { mConstants.push_back(constantvalue); } } // compare token symbol text with source text else Passed = isSymbol(mRootRulePath[rulepathIDX].mSymbol, tokenlength); if(Passed) { TokenInst newtoken; // push token onto end of container newtoken.mID = TokenID; newtoken.mNTTRuleID = activeRuleID; newtoken.mLine = mCurrentLine; newtoken.mPos = mCharPos; mTokenInstructions.push_back(newtoken); // update source position mCharPos += tokenlength; // allow token instruction to change the ActiveContexts // use token contexts pattern to clear ActiveContexts pattern bits mActiveContexts &= ~mSymbolTypeLib[TokenID].mContextPatternClear; // use token contexts pattern to set ActiveContexts pattern bits mActiveContexts |= mSymbolTypeLib[TokenID].mContextPatternSet; } } } // else a non terminal token was found else { // execute rule for non-terminal // get rule_ID for index into rulepath to be called Passed = processRulePath(mSymbolTypeLib[TokenID].mRuleID); } } return Passed; }
void CompositorScriptCompilerTests::testIsFloatValue(void) { struct testfloatresult{ const String teststr; const float fvalue; const size_t charsize; testfloatresult(const String& _teststr, const float _fvalue, const size_t _charsize) : teststr(_teststr) , fvalue(_fvalue) , charsize(_charsize) {}; }; testfloatresult testfloatresults[] = { testfloatresult("1 test", 1.0f, 1), testfloatresult("2.3f test", 2.3f, 3), testfloatresult("-0.5 test", -0.5f, 4), testfloatresult(" 23.6 test", 23.6f, 5), testfloatresult(" -0.021 test", -0.021f, 8), testfloatresult("12 test", 12.0f, 2), testfloatresult("3test", 3.0f, 1) }; float fvalue = 0; size_t charsize = 0; mCharPos = 0; size_t testsize = ARRAYSIZE(testfloatresults); for(size_t resultID=0; resultID<testsize; resultID++) { mSource = &testfloatresults[resultID].teststr; isFloatValue(fvalue, charsize); CPPUNIT_ASSERT_MESSAGE( "test " + StringConverter::toString(resultID) + " value returned: " + StringConverter::toString(fvalue) , fvalue == testfloatresults[resultID].fvalue); CPPUNIT_ASSERT_MESSAGE( "test " + StringConverter::toString(resultID) + " char size returned: " + StringConverter::toString(charsize) , charsize == testfloatresults[resultID].charsize); } }