Ejemplo n.º 1
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);
                    }
                }
            }
        }
Ejemplo n.º 2
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;
        }
Ejemplo 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;
        }
Ejemplo n.º 4
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;
 }