RuleParser.cpp revision 93250d172612c405135d56ffd306deae5ebc6df1
193250d172612c405135d56ffd306deae5ebc6df1Kevin Rocard/* 20bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * INTEL CONFIDENTIAL 30bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * Copyright © 2011 Intel 40bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * Corporation All Rights Reserved. 50bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * 60bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * The source code contained or described herein and all documents related to 70bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * the source code ("Material") are owned by Intel Corporation or its suppliers 80bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * or licensors. Title to the Material remains with Intel Corporation or its 90bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * suppliers and licensors. The Material contains trade secrets and proprietary 100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * and confidential information of Intel or its suppliers and licensors. The 110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * Material is protected by worldwide copyright and trade secret laws and 120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * treaty provisions. No part of the Material may be used, copied, reproduced, 130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * modified, published, uploaded, posted, transmitted, distributed, or 140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * disclosed in any way without Intel’s prior express written permission. 150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * 160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * No license under any patent, copyright, trade secret or other intellectual 170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * property right is granted to or conferred upon you by disclosure or delivery 180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * of the Materials, either expressly, by implication, inducement, estoppel or 190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * otherwise. Any license under such intellectual property rights must be 200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * express and approved by Intel in writing. 210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * 220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * CREATED: 2011-06-01 230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli * UPDATED: 2011-07-27 240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli */ 250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include "RuleParser.h" 260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include "CompoundRule.h" 270bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include "SelectionCriterionRule.h" 280bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli#include <assert.h> 290bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 300bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Matches 310bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst char* CRuleParser::_acDelimiters[CRuleParser::ENbStatuses] = { 320bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "{", // EInit 330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "{} ", // EBeginCompoundRule 340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli ",}", // EEndCompoundRule 350bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli ",}", // ECriterionRule 360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "{ ", // EContinue 370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli "" // EDone 380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}; 390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 400bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCRuleParser::CRuleParser(const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition) : 410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _strApplicationRule(strApplicationRule), 420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pSelectionCriteriaDefinition(pSelectionCriteriaDefinition), 430bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentPos(0), 440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentDeepness(0), 450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus(CRuleParser::EInit), 460bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pRootRule(NULL) 470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 500bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCRuleParser::~CRuleParser() 510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete _pRootRule; 530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Parse 560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CRuleParser::parse(CCompoundRule* pParentRule, string& strError) 570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli while (true) { 590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Iterate till next relevant delimiter 600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!iterate(strError)) { 610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli switch(_eStatus) { 650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case EBeginCompoundRule: { 660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Create new compound rule 680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CCompoundRule* pCompoundRule = new CCompoundRule; 690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pCompoundRule->parse(*this, strError)) { 720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete pCompoundRule; 740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parent rule creation context? 780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (pParentRule) { 790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Chain 810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pParentRule->addChild(pCompoundRule); 820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } else { 830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Root rule 840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete _pRootRule; 850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pRootRule = pCompoundRule; 860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!parse(pCompoundRule, strError)) { 890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Go on 930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case EEndCompoundRule: 960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case EContinue: 980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Seek for new rule 990bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case ECriterionRule: { 1010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Create new criterion rule 1020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CSelectionCriterionRule* pCriterionRule = new CSelectionCriterionRule; 1030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 1050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pCriterionRule->parse(*this, strError)) { 1060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli delete pCriterionRule; 1080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Chain 1130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pParentRule->addChild(pCriterionRule); 1140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Go on 1160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 11819bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard case EDone: { 11919bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard // If the current state is EDone, check that at least one rule has been found. 12019bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard if (_pRootRule) { 12119bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 12219bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard // At least one rule found 12319bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard return true; 12419bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard } else { 12519bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 12619bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard strError = "Syntax error, no rule found"; 12719bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 12819bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard return false; 12919bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard } 13019bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard 13119bb62917f765c3fa11d1d4c5f88c445e22f227aFrederic Boisnard } 1320bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli default: 1330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli assert(0); 1340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1350bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 1390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 1400bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Iterate 1420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CRuleParser::iterate(string& strError) 1430bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 1440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli string::size_type iDelimiter; 1450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1460bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli assert(_uiCurrentPos <= _strApplicationRule.length()); 1470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Consume spaces 1490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if ((iDelimiter = _strApplicationRule.find_first_not_of(" ", _uiCurrentPos)) != string::npos) { 1500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 1520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentPos = iDelimiter; 1530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Parse 1560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if ((_uiCurrentPos != _strApplicationRule.length()) && ((iDelimiter = _strApplicationRule.find_first_of(_acDelimiters[_eStatus], _uiCurrentPos)) != string::npos)) { 1570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli switch(_strApplicationRule[iDelimiter]) { 1590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case '{': 1610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EBeginCompoundRule; 1620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Extract type 1630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _strRuleType = _strApplicationRule.substr(_uiCurrentPos, iDelimiter - _uiCurrentPos); 1640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentDeepness++; 1650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case '}': 1670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EEndCompoundRule; 1680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!_uiCurrentDeepness--) { 1700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Missing opening brace"; 1720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case ' ': 1770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = ECriterionRule; 1780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Extract type 1790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _strRuleType = _strApplicationRule.substr(_uiCurrentPos, iDelimiter - _uiCurrentPos); 1800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli case ',': 1820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EContinue; 1830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli break; 1840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 1860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentPos = iDelimiter + 1; 1870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } else { 1880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (_uiCurrentDeepness) { 1900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Missing closing brace"; 1920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 1940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 1950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Remaining characters 1970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (_uiCurrentPos != _strApplicationRule.length()) { 1980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 1990bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Syntax error"; 2000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 2020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Done 2040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _eStatus = EDone; 2050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 2070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Rule type 2100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst string& CRuleParser::getType() const 2110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return _strRuleType; 2130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Criteria defintion 2160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst CSelectionCriteriaDefinition* CRuleParser::getSelectionCriteriaDefinition() const 2170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return _pSelectionCriteriaDefinition; 2190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Root rule 2220bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCCompoundRule* CRuleParser::grabRootRule() 2230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CCompoundRule* pRootRule = _pRootRule; 2250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli assert(pRootRule); 2270bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2280bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _pRootRule = NULL; 2290bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2300bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pRootRule; 2310bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 2320bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Next word 2340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CRuleParser::next(string& strNext, string& strError) 2350bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 2360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli string::size_type iDelimiter; 2370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Consume spaces 2390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if ((iDelimiter = _strApplicationRule.find_first_not_of(" ", _uiCurrentPos)) != string::npos) { 2400bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 2420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentPos = iDelimiter; 2430bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if ((iDelimiter = _strApplicationRule.find_first_of("{} ,", _uiCurrentPos)) == string::npos) { 2460bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Syntax error"; 2480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 2500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 2510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strNext = _strApplicationRule.substr(_uiCurrentPos, iDelimiter - _uiCurrentPos); 2530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // New pos 2550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli _uiCurrentPos = iDelimiter; 2560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 2570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 2580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 259