Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }