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