Пример #1
0
        private IPair <Phrase> ParsePhrase(Token token, bool isFirst)
        {
            var           startLoc  = token.Range.Start;
            var           lst       = new List <ArgumentTuple>();
            bool          isMap     = false;
            ArgumentTuple mappedArg = null;

            while (true)
            {
                if (token.Match((ReservedToken t) => t.Text == "それぞれ"))
                {
                    if (isMap)
                    {
                        throw Error("「それぞれ」を二箇所で使うことはできません。", token);
                    }
                    isMap = true;
                    if (lst.Count == 1)
                    {
                        mappedArg = lst[0];
                    }
                    else if (lst.Count > 1)
                    {
                        var tmpArg = CreateTuple(lst);
                        if (tmpArg != null)
                        {
                            mappedArg = tmpArg;
                        }
                        else
                        {
                            throw Error("「それぞれ」に対して、二つ以上の引数を与えることはできません。", token);
                        }
                    }
                    lst.Clear();
                    token = token.Next;
                }
                var argPair = ParseArgSfxPair(token);
                if (argPair == null)
                {
                    break;
                }
                lst.Add(argPair.Node);
                token = argPair.Token;
                if (token.Match((SuffixToken t) => true))
                {
                    var sfx   = ((SuffixToken)token).Text;
                    var range = new TextRange(token.Range.End, token.Range.End);
                    lst.Add(new ArgumentTuple(new Literal(null, range), sfx));
                    token = token.Next;
                }
            }

            if (token.Match((ReservedToken t) => t.Text == "し" || t.Text == "する"))
            {
                var range = new TextRange(startLoc, token.Range.End);
                var dfn   = CreateDefine(lst, range);
                if (dfn == null)
                {
                    throw Error("引数が正しくありません。", token);
                }
                return(MakePair(dfn, token.Next));
            }
            var execTarget = ParseBinaryExpr(token);

            if (execTarget == null)
            {
                return(null);
            }
            var execToken = execTarget.Token;
            var last      = execToken
                            .MatchFlow((ReservedToken t) => t.Text == "し" || t.Text == "する");
            bool isMaybe = false;

            if (last == null)
            {
                last = execToken
                       .MatchFlow((ReservedToken t) => t.Text == "してみ" || t.Text == "してみて");
                if (last == null)
                {
                    return(null);
                }
                isMaybe = true;
            }
            if (last != null)
            {
                var range = new TextRange(startLoc, execToken.Range.End);
                var sym   = token as SymbolToken;
                if (sym != null && sym.Text == ConstantNames.Assign)
                {
                    var assign = CreateAssign(lst, isFirst, isMaybe, range);
                    if (assign == null)
                    {
                        return(null);
                    }
                    return(MakePair(assign, last));
                }
                var verb = execTarget.Node;
                if (isMap)
                {
                    return(MakePair(new MapCall(verb, mappedArg, lst, isMaybe, range), last));
                }
                else
                {
                    return(MakePair(new Call(verb, lst, isMaybe, range), last));
                }
            }
            return(null);
        }
Пример #2
0
 public MapCall(Element name, ArgumentTuple firstArg, IList <ArgumentTuple> args, bool isMaybe, TextRange range)
     : base(name, args, isMaybe, range)
 {
     this.FirstArg = firstArg;
 }
Пример #3
0
 public MapCall(Element name, ArgumentTuple firstArg, IList<ArgumentTuple> args, bool isMaybe, TextRange range)
     : base(name, args, isMaybe, range)
 {
     this.FirstArg = firstArg;
 }