Esempio n. 1
0
        private bool _return()
        {
            TokenTry();
            bool is_value = _value();

            if (!Accept(NakoTokenType.RETURN))
            {
                TokenBack();
                return(false);
            }
            TokenFinally();
            if (is_value)
            {
                NakoNodeLet      node = new NakoNodeLet();
                NakoNodeVariable sore = new NakoNodeVariable();
                sore.varNo   = (int)0;
                sore.scope   = NakoVariableScope.Global;
                node.VarNode = sore;
                NakoNodeLetValue valuenode = new NakoNodeLetValue();
                while (calcStack.Count > 0)
                {
                    valuenode.AddChild(calcStack.Shift());
                }
                node.ValueNode = (NakoNode)valuenode;
                parentNode.AddChild(node);
            }
            parentNode.AddChild(new NakoNodeReturn());
            tok.MoveNext();
            return(true);
        }
Esempio n. 2
0
        private void _let(NakoNodeLet node)
        {
            NakoNodeVariable varNode   = node.VarNode;
            NakoNode         valueNode = node.ValueNode;

            // 配列要素があるか確認
            if (!varNode.useElement)
            {
                // + 要素なしの代入処理
                // - 代入する値を書き込んで...
                Write_r(valueNode);
                // - セットする
                NakoILCode st = new NakoILCode();
                st.value = varNode.varNo;
                st.type  = (varNode.scope == NakoVariableScope.Global)
                    ? NakoILType.ST_GLOBAL
                    : NakoILType.ST_LOCAL;
                result.Add(st);
            }
            else // 配列要素があるとき
            {
                // + 配列への代入処理
                // - 基本となる変数をセット
                NakoILCode ldvar = new NakoILCode();
                ldvar.value = varNode.varNo;
                ldvar.type  = (varNode.scope == NakoVariableScope.Global)
                    ? NakoILType.LD_GLOBAL_REF
                    : NakoILType.LD_LOCAL_REF;
                result.Add(ldvar);
                // - アクセス要素をセット
                int count = varNode.Children.Count;
                for (int i = 0; i < count; i++)
                {
                    NakoNode n = varNode.Children[i];
                    Write_r(n); // ノードの値

                    if (i < count - 1)
                    {
                        result.Add(new NakoILCode(NakoILType.LD_ELEM_REF)); // 要素
                    }
                    else
                    {
                        // 値ノード
                        Write_r(valueNode);
                        addNewILCode(NakoILType.ST_ELEM);
                    }
                }
            }
        }
Esempio n. 3
0
        //> _let : _setVariable EQ _value
        private bool _let()
        {
            TokenTry();
            if (!_setVariable())
            {
                TokenBack();
                return(false);
            }
            if (!Accept(NakoTokenType.EQ))
            {
                TokenBack();
                return(false);
            }

            NakoNodeLet node = new NakoNodeLet();

            node.VarNode = (NakoNodeVariable)lastNode; // _setVariable のノード
            tok.MoveNext();
            if (!_value())
            {
                throw new NakoParserException("代入文で値がありません。", tok.CurrentToken);
            }
            TokenFinally();

            NakoNodeLetValue valuenode = new NakoNodeLetValue();

            while (calcStack.Count > 0)
            {
                valuenode.AddChild(calcStack.Shift());
            }
            node.ValueNode = (NakoNode)valuenode;
            parentNode.AddChild(node);
            lastNode = node;

            return(true);
        }
Esempio n. 4
0
        //> _def_variable : WORD (DIM_VARIABLE|DIM_NUMBER|DIM_INT|DIM_STRING|DIM_ARRAY) [=_value]
        //>               ;
        private bool _def_variable()
        {
            if (!Accept(NakoTokenType.WORD))
            {
                return(false);
            }
            NakoVarType st = NakoVarType.Object;

            switch (tok.NextTokenType)
            {
            case NakoTokenType.DIM_VARIABLE:
                st = NakoVarType.Object;
                break;

            case NakoTokenType.DIM_NUMBER:
                st = NakoVarType.Double;
                break;

            case NakoTokenType.DIM_INT:
                st = NakoVarType.Int;
                break;

            case NakoTokenType.DIM_STRING:
                st = NakoVarType.String;
                break;

            case NakoTokenType.DIM_ARRAY:
                st = NakoVarType.Array;
                break;

            default:
                return(false);
            }
            NakoToken    t     = tok.CurrentToken;
            int          varNo = localVar.CreateVar(t.GetValueAsName());
            NakoVariable v     = localVar.GetVar(varNo);

            v.SetBody(null, st);
            tok.MoveNext(); // skip WORD
            tok.MoveNext(); // skip DIM_xxx

            // 変数の初期化があるか?
            if (!Accept(NakoTokenType.EQ))
            {
                return(true); // なければ正常値として戻る
            }
            tok.MoveNext();   // skip EQ

            if (!_value())
            {
                throw new NakoParserException("変数の初期化文でエラー。", t);
            }
            // 代入文を作る
            NakoNodeLet let = new NakoNodeLet();

            let.VarNode       = new NakoNodeVariable();
            let.VarNode.varNo = varNo;
            let.VarNode.scope = NakoVariableScope.Local;
            let.ValueNode.AddChild(calcStack.Pop());
            this.parentNode.AddChild(let);
            return(true);
        }