コード例 #1
0
ファイル: NakoParser.cs プロジェクト: wnoguchi/nadesiko2
        //> _const : INT | NUMBER | STRING ;
        private bool _const()
        {
            NakoNodeConst node = new NakoNodeConst();
            node.Token = tok.CurrentToken;

            if (Accept(NakoTokenType.INT))
            {
                node.type = NakoNodeType.INT;
                node.value = long.Parse(node.Token.Value);
                lastNode = node;
                tok.MoveNext();
                calcStack.Push(node);
                return true;
            }
            else if (Accept(NakoTokenType.NUMBER))
            {
                node.type = NakoNodeType.NUMBER;
                node.value = double.Parse(node.Token.Value);
                lastNode = node;
                tok.MoveNext();
                calcStack.Push(node);
                return true;
            }
            else if (Accept(NakoTokenType.STRING))
            {
                node.type = NakoNodeType.STRING;
                node.value = node.Token.Value;
                lastNode = node;
                tok.MoveNext();
                calcStack.Push(node);
                return true;
            }

            return false;
        }
コード例 #2
0
ファイル: NakoParser.cs プロジェクト: wnoguchi/nadesiko2
 private bool _minus_flag()
 {
     tok.MoveNext();
     if (Accept(NakoTokenType.INT)||Accept(NakoTokenType.NUMBER))
     {
         _const();
         NakoNodeConst c = (NakoNodeConst)calcStack.Pop();
         if (c.value is long) {
             c.value = ((long)(c.value) * -1);
         } else {
             c.value = ((double)(c.value) * -1);
         }
         calcStack.Push(c);
         lastNode = c;
         return true;
     }
     NakoNodeCalc nc = new NakoNodeCalc();
     nc.calc_type = CalcType.MUL;
     NakoNodeConst m1 = new NakoNodeConst();
     m1.value = -1;
     m1.type = NakoNodeType.INT;
     NakoNode v = calcStack.Pop();
     nc.nodeL = v;
     nc.nodeR = m1;
     calcStack.Push(nc);
     return true;
 }
コード例 #3
0
ファイル: NakoParser.cs プロジェクト: wnoguchi/nadesiko2
        //> _callfunc : FUNCTION_NAME
        //>           | FUNCTION_NAME _arglist
        //>           ;
        private bool _callfunc()
        {
            NakoToken t = tok.CurrentToken;

            if (!Accept(NakoTokenType.FUNCTION_NAME))
            {
                return false;
            }
            tok.MoveNext(); // skip FUNCTION_NAME

            string fname = t.GetValueAsName();
            NakoVariable var = globalVar.GetVar(fname);
            if (var == null)
            {
                throw new NakoParserException("関数『" + fname + "』が見あたりません。", t);
            }

            //
            NakoNodeCallFunction callNode = new NakoNodeCallFunction();
            NakoFunc func = null;
            callNode.Token = t;

            if (var.Type == NakoVarType.SystemFunc)
            {
                int funcNo = (int)var.Body;
                func = NakoAPIFuncBank.Instance.FuncList[funcNo];
                callNode.func = func;
            }
            else
            {
                NakoNodeDefFunction defNode = (NakoNodeDefFunction)var.Body;
                func = callNode.func = defNode.func;
                callNode.value = defNode;
            }

            // ---------------------------------
            if (Accept(NakoTokenType.PARENTHESES_L))
            {
                _arglist(callNode);
                // TODO ここで引数の数をチェックする処理
            }
            // 引数の数だけノードを取得
            for (int i = 0; i < func.ArgCount; i++)
            {
                NakoFuncArg arg = func.args[func.ArgCount - i - 1];
                NakoNode argNode;
                if (arg.defaultValue != null && calcStack.Count < (func.ArgCount - i)) {//初期値があって引数が無い場合に引数に初期値を与える
                    argNode = new NakoNodeConst();
                    argNode.value = arg.defaultValue;
                    if (arg.defaultValue is int) {
                        argNode.type = NakoNodeType.INT;
                        argNode.Token = new NakoToken (NakoTokenType.INT);
                    } else if (arg.defaultValue is string) {
                        argNode.type = NakoNodeType.STRING;
                        argNode.Token = new NakoToken (NakoTokenType.STRING);
                    }
                } else {
                    argNode = calcStack.Pop (arg);
                }
                if (arg.varBy == VarByType.ByRef)
                {
                    if (argNode.type == NakoNodeType.LD_VARIABLE)
                    {
                        ((NakoNodeVariable)argNode).varBy = VarByType.ByRef;
                    }
                }
                callNode.AddChild(argNode);
            }

            // ---------------------------------
            // 計算スタックに関数の呼び出しを追加
            calcStack.Push(callNode);
            this.lastNode = callNode;

            return true;
        }