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