Goose  resolver.h at [1cdacffc17]

File bs/parse/resolver.h artifact b58c67a065 part of check-in 1cdacffc17


#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 newlines until a non newline token or eos is reached.
            void consumeNewLines();

            // 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