///

    public static NeuOperation Execute(
        this NeuInterpreter interpreter,
        bool inGlobalScope,
        NeuKeyword kindKeyword,
        NeuIdentifierPattern idPattern,
        NeuInitClause initClause)
    {
        var id = idPattern.GetIdentifier();

        if (id == null)
        {
            throw new Exception();
        }

        ///

        var name = id.Source;

        if (IsNullOrWhiteSpace(name))
        {
            throw new Exception();
        }

        ///

        var initializer = initClause.GetInitializer();

        if (initializer == null)
        {
            throw new Exception();
        }

        ///

        var initValue = interpreter.Execute(initializer);

        ///

        switch (true)
        {
        case var _
            when
            inGlobalScope &&
            kindKeyword.KeywordType == NeuKeywordType.Let:

            var globalScopedLet = interpreter.CreateVar(name, null, null, null, initValue);

            if (globalScopedLet == null)
            {
                throw new Exception();
            }

            return(globalScopedLet);

        ///

        case var _
            when
            inGlobalScope &&
            kindKeyword.KeywordType == NeuKeywordType.Var:

            var globalScopedVar = interpreter.CreateVar(name, null, null, null, initValue);

            if (globalScopedVar == null)
            {
                throw new Exception();
            }

            return(globalScopedVar);

        ///

        case var _
            when
            kindKeyword.KeywordType == NeuKeywordType.Let:

            var hoistedLet = interpreter.HoistVar(kindKeyword.KeywordType, name, initValue);

            if (hoistedLet == null)
            {
                throw new Exception();
            }

            return(hoistedLet);

        ///

        case var _
            when
            kindKeyword.KeywordType == NeuKeywordType.Var:

            var hoistedVar = interpreter.HoistVar(kindKeyword.KeywordType, name, initValue);

            if (hoistedVar == null)
            {
                throw new Exception();
            }

            return(hoistedVar);

        ///

        default:

            throw new Exception();
        }
    }
예제 #2
0
 public static NeuIdentifier?GetIdentifier(
     this NeuIdentifierPattern idPattern)
 {
     return(idPattern.GetFirstOrDefault <NeuIdentifier>());
 }