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