/// <summary> /// なでしこのシステム関数を定義する関数 /// </summary> /// <param name="name"></param> /// <param name="fullname"></param> /// <param name="argdef"></param> /// <param name="resultType"></param> /// <param name="FuncDl"></param> public NakoAPIFunc(string name, string fullname, string argdef, NakoVarType resultType, SysCallDelegate FuncDl) : base(name, fullname, argdef) { this.FuncDl = FuncDl; this.resultType = resultType; this.Used = false; }
/// <summary> /// 関数をシステムに追加する /// </summary> /// <param name="name">関数の名前</param> /// <param name="argdef">引数の定義</param> /// <param name="resultType">関数の戻り値</param> /// <param name="f">実際に処理を行うC#のdelegate</param> /// <param name="desc">関数の説明</param> /// <param name="kana">命令のよみがな</param> protected void addFunc(string name, string argdef, NakoVarType resultType, SysCallDelegate f, string desc, string kana) { name = NakoToken.TrimOkurigana(name); NakoAPIFunc s = new NakoAPIFunc(name, argdef, resultType, f); NakoAPIFuncBank.Instance.AddFunc(s); }
/// <summary> /// なでしこのシステム関数を定義する関数 /// </summary> /// <param name="name"></param> /// <param name="argdef"></param> /// <param name="resultType"></param> /// <param name="FuncDl"></param> public NakoAPIFunc(string name, string argdef, NakoVarType resultType, SysCallDelegate FuncDl) : base(name, argdef) { this.FuncDl = FuncDl; this.resultType = resultType; this.Used = false; }
/// <summary> /// 値の型を自動的に判別し、値と型を設定する /// </summary> /// <param name="value"></param> public void SetBodyAutoType(object value) { // detect type if (value is int) { _type = NakoVarType.Int; _body = Convert.ToInt64(value); } else if (value is long) { _type = NakoVarType.Int; _body = value; } else if (value is double) { _type = NakoVarType.Double; _body = value; } else if (value is string) { _type = NakoVarType.String; _body = value; } else if (value is NakoVarArray) { _type = NakoVarType.Array; _body = value; } else { _type = NakoVarType.Object; _body = value; } }
/// <summary> /// 関数を追加 /// </summary> /// <param name="name"></param> /// <param name="argdef"></param> /// <param name="resultType"></param> /// <param name="f"></param> /// <param name="desc"></param> /// <param name="kana"></param> public void AddFunc(string name, string argdef, NakoVarType resultType, NakoPlugin.SysCallDelegate f, string desc, string kana) { name = NakoToken.TrimOkurigana(name); NakoAPIFunc s = new NakoAPIFunc(name, argdef, resultType, f); s.PluginInstance = PluginInstance; this.AddFuncToList(s); }
/// <summary> /// 値と型を明示して設定する /// </summary> /// <param name="value"></param> /// <param name="type"></param> public void SetBody(object value, NakoVarType type) { _body = value; _type = type; }
/// <summary> /// 初期化 /// </summary> public void Init() { this.scope = NakoVariableScope.Global; this.varType = NakoVarType.Int; this.varNo = -1; this.varBy = VarByType.ByVal; }
//> _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); }