193250d172612c405135d56ffd306deae5ebc6df1Kevin Rocard/* 2b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Copyright (c) 2011-2014, Intel Corporation 3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved. 40bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * 5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification, 6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met: 70bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * 8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this 9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer. 100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * 11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice, 12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or 13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution. 14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors 16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without 17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission. 18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli */ 300bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include "RuleParser.h" 310bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include "CompoundRule.h" 320bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include "SelectionCriterionRule.h" 330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include <assert.h> 340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 35d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string; 36d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve 370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Matches 380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst char* CRuleParser::_acDelimiters[CRuleParser::ENbStatuses] = { 390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "{", // EInit 400bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "{} ", // EBeginCompoundRule 410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli ",}", // EEndCompoundRule 420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli ",}", // ECriterionRule 430bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "{ ", // EContinue 440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "" // EDone 450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}; 460bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 470bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCRuleParser::CRuleParser(const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition) : 480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _strApplicationRule(strApplicationRule), 490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pSelectionCriteriaDefinition(pSelectionCriteriaDefinition), 500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentPos(0), 510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentDeepness(0), 520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus(CRuleParser::EInit), 530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pRootRule(NULL) 540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 570bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCRuleParser::~CRuleParser() 580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete _pRootRule; 600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Parse 630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CRuleParser::parse(CCompoundRule* pParentRule, string& strError) 640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli while (true) { 660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Iterate till next relevant delimiter 670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!iterate(strError)) { 680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli switch(_eStatus) { 720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case EBeginCompoundRule: { 730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Create new compound rule 750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CCompoundRule* pCompoundRule = new CCompoundRule; 760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pCompoundRule->parse(*this, strError)) { 790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete pCompoundRule; 810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parent rule creation context? 850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (pParentRule) { 860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Chain 880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pParentRule->addChild(pCompoundRule); 890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } else { 900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Root rule 910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete _pRootRule; 920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pRootRule = pCompoundRule; 930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!parse(pCompoundRule, strError)) { 960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 990bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Go on 1000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case EEndCompoundRule: 1030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 1040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case EContinue: 1050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Seek for new rule 1060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case ECriterionRule: { 1080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Create new criterion rule 1090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CSelectionCriterionRule* pCriterionRule = new CSelectionCriterionRule; 1100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 1120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pCriterionRule->parse(*this, strError)) { 1130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete pCriterionRule; 1150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Chain 1200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pParentRule->addChild(pCriterionRule); 1210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Go on 1230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 12519bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard case EDone: { 12619bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard // If the current state is EDone, check that at least one rule has been found. 12719bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard if (_pRootRule) { 12819bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 12919bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard // At least one rule found 13019bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard return true; 13119bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard } else { 13219bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 13319bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard strError = "Syntax error, no rule found"; 13419bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 13519bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard return false; 13619bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard } 13719bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 13819bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard } 1390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli default: 1400bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli assert(0); 1410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1430bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 1460bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 1470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Iterate 1490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CRuleParser::iterate(string& strError) 1500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 1513807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve string::size_type delimiter; 1520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli assert(_uiCurrentPos <= _strApplicationRule.length()); 1540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Consume spaces 1563807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve if ((delimiter = _strApplicationRule.find_first_not_of(" ", _uiCurrentPos)) != string::npos) { 1570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 1593807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve _uiCurrentPos = delimiter; 1600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 1633807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve if ((_uiCurrentPos != _strApplicationRule.length()) && ((delimiter = _strApplicationRule.find_first_of(_acDelimiters[_eStatus], _uiCurrentPos)) != string::npos)) { 1640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1653807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve switch(_strApplicationRule[delimiter]) { 1660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case '{': 1680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EBeginCompoundRule; 1690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Extract type 1703807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve _strRuleType = _strApplicationRule.substr(_uiCurrentPos, delimiter - _uiCurrentPos); 1710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentDeepness++; 1720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case '}': 1740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EEndCompoundRule; 1750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!_uiCurrentDeepness--) { 1770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Missing opening brace"; 1790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case ' ': 1840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = ECriterionRule; 1850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Extract type 1863807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve _strRuleType = _strApplicationRule.substr(_uiCurrentPos, delimiter - _uiCurrentPos); 1870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case ',': 1890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EContinue; 1900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 1933807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve _uiCurrentPos = delimiter + 1; 1940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } else { 1950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (_uiCurrentDeepness) { 1970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Missing closing brace"; 1990bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 2010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Remaining characters 2040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (_uiCurrentPos != _strApplicationRule.length()) { 2050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Syntax error"; 2070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 2090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Done 2110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EDone; 2120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 2140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Rule type 2170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst string& CRuleParser::getType() const 2180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return _strRuleType; 2200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Criteria defintion 2230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst CSelectionCriteriaDefinition* CRuleParser::getSelectionCriteriaDefinition() const 2240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return _pSelectionCriteriaDefinition; 2260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2270bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2280bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Root rule 2290bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCCompoundRule* CRuleParser::grabRootRule() 2300bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2310bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CCompoundRule* pRootRule = _pRootRule; 2320bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli assert(pRootRule); 2340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2350bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pRootRule = NULL; 2360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pRootRule; 2380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2400bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Next word 2410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CRuleParser::next(string& strNext, string& strError) 2420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2433807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve string::size_type delimiter; 2440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Consume spaces 2463807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve if ((delimiter = _strApplicationRule.find_first_not_of(" ", _uiCurrentPos)) != string::npos) { 2470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 2493807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve _uiCurrentPos = delimiter; 2500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2523807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve if ((delimiter = _strApplicationRule.find_first_of("{} ,", _uiCurrentPos)) == string::npos) { 2530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Syntax error"; 2550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 2570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2593807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve strNext = _strApplicationRule.substr(_uiCurrentPos, delimiter - _uiCurrentPos); 2600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 2623807b5d7441ab19e5b0e1e5b5da76b1ecd21229aSebastien Gonzalve _uiCurrentPos = delimiter; 2630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 2650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 266