Ignore:
Timestamp:
Dec 19, 2017, 12:17:52 PM (15 months ago)
Author:
cameron
Message:

Further parser bug fixes and restructuring

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_parser.h

    r5787 r5789  
    88#define RE_PARSER_H
    99
    10 #include <map>                           // for map
    11 #include <re/re_memoizer.hpp>            // for Memoizer
    12 #include "re/re_cc.h"                    // for codepoint_t, CC (ptr only)
     10#include <map>
     11#include <re/re_memoizer.hpp>
     12#include "re/re_cc.h"
     13
    1314namespace re { class Name; }
    1415
     
    1718enum RE_Syntax {FixedStrings, BRE, ERE, PCRE, PROSITE};
    1819
    19 enum CharsetOperatorKind
    20     {intersectOp, setDiffOp, ampChar, hyphenChar, rangeHyphen, posixPropertyOpener, setOpener, setCloser, backSlash, emptyOperator};   
    21    
    2220enum ModeFlagType : unsigned {
    2321    DEFAULT_MODE = 0,
     
    116114    }
    117115   
     116    inline void require(char c) {
     117        if (!accept(c)) {
     118            if (mCursor.noMore()) ParseFailure("Expecting " + std::string(1, c) + " but end of input encountered");
     119            ParseFailure("Expecting " + std::string(1, c) + " but " + std::string(1, *mCursor) + " encountered");
     120        }
     121    }
     122   
    118123    inline bool atany(std::string s) {
    119124        if (mCursor.noMore()) return false;
     
    134139   
    135140    inline bool accept(std::string s) {
     141        Cursor tmp = mCursor;
    136142        for (unsigned i = 0; i < s.length(); i++) {
    137             if (mCursor.noMore() || (s[i] != *mCursor)) return false;
    138             mCursor++;
    139         }
     143            if (tmp.noMore() || (s[i] != *tmp)) return false;
     144            tmp++;
     145        }
     146        mCursor = tmp;
    140147        return true;
    141148    }
    142149   
    143 
     150    inline void require(std::string s) {
     151        if (!accept(s)) {
     152            if (mCursor.noMore()) ParseFailure("Expecting " + s + " but end of input encountered");
     153            unsigned long rem = mCursor.remaining();
     154            ParseFailure("Expecting " + s + " but " + std::string(mCursor.pos(), mCursor.pos() + std::min(rem, s.length())) + " encountered");
     155        }
     156    }
     157   
    144158    RE_Parser(const std::string & regular_expression);
    145159
     
    155169
    156170    virtual RE * parse_group();
    157 
     171   
     172    RE * parse_mode_group(bool & closing_paren_parsed);
     173
     174    RE * parse_capture_body();
     175   
     176    RE * parse_back_reference();
     177   
    158178    virtual bool isSetEscapeChar(char c);
    159179
     
    223243    bool                        fNested;
    224244    unsigned                    mGroupsOpen;
    225     bool                        fSupportNonCaptureGroup;
    226245    Cursor                      mCursor;
    227246    unsigned                    mCaptureGroupCount;
Note: See TracChangeset for help on using the changeset viewer.