Goose  Artifact [95eee27250]

Artifact 95eee2725001f2a5d2bada40bc3f2f424b41bf95406c3c8cee77a574a9c6e12f:

  • File bs/parse/resolver.h — part of check-in [91eda406ef] at 2019-02-11 22:44:43 on branch trunk —
    • Resolver: implemented an utility function to gather blocks as lists of tokens without parsing them, for when we want to perform lazy parsing.
    • Parser: fixed some bugs with the current delimiter getting lost in nested parsers, which caused spurious misplaced end delimiter error messages.
    (user: achavasse size: 1364)

#ifndef EMPATHY_PARSE_RESOLVER_H
#define EMPATHY_PARSE_RESOLVER_H

namespace empathy::parse
{
    class Resolver
    {
        public:
            Resolver( const ptr< lex::TokenProvider >& tokProv, const sema::Context& c ) :
                m_tokProvider( tokProv ),
                m_context( c )
            {}

            Resolver( const Resolver& r, const sema::Context& c ) :
                m_tokProvider( r.m_tokProvider ),
                m_context( c )
            {}

            const auto& context() const { return m_context; }

            bool eos() const;

            optional< Term > consume();
            optional< Term > consumeUnresolved();
            optional< Term > lookAhead( size_t distance = 0 );
            optional< Term > lookAheadUnresolved( size_t distance = 0 );

            // Consume the next unit from the provider and yield each token that it contains.
            // An unit is:
            //   - any brace, paren or bracket block and every unit they contain
            //   - any other token
            Generator< Term > consumeUnit();

        private:
            Term resolve( const Term& t ) const;

            Generator< Term > consumeBlock( Delimiter end );

            ptr< lex::TokenProvider > m_tokProvider;
            sema::Context m_context;
            deque< Term > m_lookAheadCache;
    };
}

#endif