Goose  Artifact [278661d674]

Artifact 278661d67422dcc26789e4234a66ad772dc035f0f73d14eaa3357dd7ce2e3b90:

  • File bs/builtins/helpers.h — part of check-in [866b8caaca] at 2019-07-30 20:20:18 on branch trunk — Implemented the if statement. (user: achavasse size: 2084)

#ifndef EMPATHY_BUILTINS_HELPERS_H
#define EMPATHY_BUILTINS_HELPERS_H

#include "parse/parse.h"

namespace empathy::builtins
{
    extern void RegisterRule( sema::Env& env, const StringId& name, parse::Rule&& rule );

    template< typename F >
    void RegisterPrefixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
    {
        parse::RegisterPrefixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
    }

    template< typename F >
    void RegisterPostfixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
    {
        parse::RegisterPostfixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
    }

    template< typename F >
    void RegisterLeftAssInfixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
    {
        parse::RegisterLeftAssInfixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
    }

    template< typename F >
    void RegisterRightAssInfixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
    {
        parse::RegisterRightAssInfixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
    }

    // Utility function used to parse flow control statements, such as if and loops.
    // This parses a sub statement, which can be enclosed in a brace block or not.
    // It will get its own scope, with visibility rules setup to see the current
    // scope.
    // It returns a pointer to the final basic block generated by the statement.
    ptr< llr::BasicBlock > ParseSubStatement( parse::Parser& p, uint32_t precedence );

    enum class ValUnifyError
    {
        NoSolution,
        Ambiguous
    };

    // Unify the provided value with a value placeholder of the specified type,
    // and return the result or an error code.
    variant< Value, ValUnifyError > ConvertValueToType( const Context& c, const Value& val, const Term& type );
}

#endif