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); }
public MapCall(Element name, ArgumentTuple firstArg, IList <ArgumentTuple> args, bool isMaybe, TextRange range) : base(name, args, isMaybe, range) { this.FirstArg = firstArg; }
public MapCall(Element name, ArgumentTuple firstArg, IList<ArgumentTuple> args, bool isMaybe, TextRange range) : base(name, args, isMaybe, range) { this.FirstArg = firstArg; }