#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