internal static Variable Parse(ParseSession parser, int starttoken, out int consumedtokens, Origins origin) { consumedtokens = starttoken; if (parser.CheckToken(starttoken + 1, ".")) { return(null); } var basetypename = parser.PeekToken(starttoken); int totaltokens = starttoken + 1; if (parser.CheckToken(totaltokens, "<")) { ++totaltokens; if (!parser.ParseTemplateArguments(totaltokens, basetypename, out totaltokens)) { return(null); } } var varname = parser.PeekToken(totaltokens); if (!parser.CheckToken(totaltokens + 1, "=")) { return(null); } var type = TypeSignatureInstantiated.Construct(parser, starttoken, totaltokens); var variable = new Variable { Name = varname, Origin = origin, Type = type }; totaltokens += 2; Expression.Parse(parser, totaltokens, out totaltokens); while (parser.CheckToken(totaltokens, ",")) { ++totaltokens; Expression.Parse(parser, totaltokens, out totaltokens); } consumedtokens = totaltokens; return(variable); }
internal static ParsedObject <SumType> Parse(ParseSession parser) { int totaltokens = 0; if (!parser.CheckToken(0, "type")) { return(null); } Token sumtypename = parser.PeekToken(1); if (sumtypename == null || string.IsNullOrEmpty(sumtypename.Text)) { return(null); } if (parser.CheckToken(2, "<")) { if (!parser.ParseTemplateParameters(3, sumtypename, out totaltokens)) { return(null); } if (!parser.CheckToken(totaltokens, ":")) { return(null); } } else if (!parser.CheckToken(2, ":")) { return(null); } else if (!parser.CheckToken(4, "|")) { return(null); } else { totaltokens = 2; } do { ++totaltokens; if (parser.CheckToken(totaltokens + 1, "<")) { var token = parser.PeekToken(totaltokens); if (token == null) { return(null); } if (!parser.ParseTemplateArguments(totaltokens + 2, token, out totaltokens)) { return(null); } } else { ++totaltokens; } } while (parser.CheckToken(totaltokens, "|")); // Success! Consume everything and return the constructed result parser.ConsumeTokens(totaltokens); var sumtype = new SumType { }; return(new ParsedObject <SumType> { Name = sumtypename, Object = sumtype }); }