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); }
//> _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); }
//> _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); }