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