#ifndef GOOSE_PARSE_PARSER_INL
#define GOOSE_PARSE_PARSER_INL
namespace goose::parse
{
template< typename I >
void Parser::emitInstruction( I&& instr )
{
if( !cfg()->currentBB() || cfg()->currentBB()->terminator() )
{
DiagnosticsManager::GetInstance().emitSyntaxErrorMessage(
resolver()->getCurrentLocation(), "unreachable code.", 0 );
return;
}
flushValue();
cfg()->currentBB()->emplace_back( forward< I >( instr ) );
}
template< typename T >
void Parser::emitTerminator( T&& terminator )
{
if( !cfg()->currentBB() || cfg()->currentBB()->terminator() )
{
DiagnosticsManager::GetInstance().emitSyntaxErrorMessage(
resolver()->getCurrentLocation(), "unreachable code.", 0 );
return;
}
flushValue();
cfg()->currentBB()->setTerminator( forward< T >( terminator ) );
}
template< typename V >
void Parser::pushValue( V&& val )
{
if( val.isPoison() )
{
DiagnosticsManager::GetInstance().setCurrentVerbosityLevel( Verbosity::SilentLocally );
if( cfg() )
cfg()->poison();
}
flushValue();
if( val.isConstant() || !llr::CanValueBeEagerlyEvaluated( val ) )
{
m_lastValue = forward< V >( val );
return;
}
execute::VM vm;
m_lastValue = execute::Evaluate( val, vm );
}
template< typename T >
optional< uint32_t > Parser::getPrecedence( const Term&, const T& )
{
return nullopt;
}
template< typename T >
bool Parser::parsePrefix( const T&, uint32_t )
{
return false;
}
template< typename T >
bool Parser::parseInfix( const T&, uint32_t prec )
{
return false;
}
}
#endif