public override bool TryParse(Word w, Parser p) { Gen::List <Tree.IExpression> args_rev = new Gen::List <Tree.IExpression>(); // 始まりの括弧が見つかる迄 StartArgsMarker m = p.Stack.Peek() as StartArgsMarker; int c = -1; if (m == null) { args_rev.Add(null); c++; } while (m == null && !p.Stack.IsEmpty) { if (p.Stack.IsTopExpression) { args_rev[c] = p.Stack.PopOperand(-1, false).Expression; // 区切り? DelimArgsMarker d = p.Stack.Peek() as DelimArgsMarker; if (d != null) { args_rev.Add(null); c++; continue; } // 始まりの括弧? m = p.Stack.Peek() as StartArgsMarker; if (m != null) { continue; } p.ReportError(w, "引数と引数の間に区切りが入っていない可能性があります。"); continue; } if (p.Stack.IsTopPrefix) { // Prefix の適用先が見つからない return(false); } break; } if (m != null) { p.Stack.Pop(); p.PopContext(); #if PAREN_MATCH if (m.StartParen != this.start_paren) { // ※ 区間などの場合には始まりと終わりが食い違っても OK p.ReportError(w, "始まりの括弧と終わりの括弧が一致しません。"); return(true); } #endif p.Stack.Push(new ExpressionElement( new Tree.FunctionCallExpression( start_paren + w.word, m.FunctionExpression, GetArguments(args_rev) ) )); return(true); } else { p.ReportError(w, "対応する始まりの括弧が存在しません。"); return(true); } }
public override bool TryParse(Word w, Parser p) { Arguments arg = new Arguments(); // 始まりの括弧が見つかる迄 StartArgsMarker m = p.Stack.Peek() as StartArgsMarker; if (m == null) { while (!p.Stack.IsEmpty) { if (p.Stack.IsTopPrefix) { // Prefix の適用先が見つからない return(false); } if (p.Stack.IsTopExpression) { if (!arg.AddArgument(p.Stack.PopOperand(-1, false))) { // 引数が同じスロットに上書きされた時 p.ReportError(w, "引数と引数の間に区切りが入っていない可能性があります。"); } continue; } DelimArgsMarker d = p.Stack.Peek() as DelimArgsMarker; if (d != null) { p.Stack.Pop(); arg.AddDelim(d.Word); continue; } m = p.Stack.Peek() as StartArgsMarker; if (m != null) { break; } break; } } if (m != null) { p.Stack.Pop(); p.PopContext(); #if PAREN_MATCH if (m.StartParen != this.start_paren) { // ※ 区間などの場合には始まりと終わりが食い違っても OK p.ReportError(w, "始まりの括弧と終わりの括弧が一致しません。"); return(true); } #endif p.Stack.Push(new ExpressionElement( new Tree.FunctionCallExpression( m.StartParen + w.word, m.FunctionExpression, arg.GetArguments(), arg.GetDelims() ) )); return(true); } else { p.ReportError(w, "対応する始まりの括弧が見つかりません。"); return(true); } }