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