Goose  Artifact [131aa197d2]

Artifact 131aa197d29dcb9a05f74b134a5b8a8504beeeb5d766454afd908397b1aff377:

  • File bs/parse/parser.inl — part of check-in [af650a9e95] at 2019-09-22 14:37:55 on branch trunk — Project renaming. (user: achavasse size: 1885)

#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