public static FunctionSignature Parse(ParseSession parser) { var nametoken = parser.PeekToken(0); if (nametoken == null || string.IsNullOrEmpty(nametoken.Text)) { return(null); } int totaltokens = 1; if (parser.CheckToken(totaltokens, "<")) { ++totaltokens; if (!parser.ParseTemplateParameters(totaltokens, nametoken, out totaltokens)) { return(null); } } if (!parser.CheckToken(totaltokens, ":")) { return(null); } ++totaltokens; var overload = new FunctionOverload(); if (!parser.CheckToken(totaltokens, "[")) { var paramlist = ParseFunctionParams(parser, totaltokens, out totaltokens); var funcreturn = ParseFunctionReturn(parser, totaltokens, out totaltokens); overload.Parameters = paramlist; overload.ReturnType = funcreturn?.Type; } var tags = ParseFunctionTags(parser, totaltokens, out totaltokens); overload.Tags = tags; if (parser.CheckToken(totaltokens, "{")) { ++totaltokens; var scope = ParseCodeBlock(parser, null, totaltokens, out totaltokens); overload.Scope = scope; if (overload.Scope != null && overload.Parameters != null) { foreach (var p in overload.Parameters) { var v = new Variable { Name = p.Name, Type = p.Type, Origin = Variable.Origins.Parameter }; overload.Scope.Variables.Add(v); } } } parser.ConsumeTokens(totaltokens); var ret = new FunctionSignature { Name = nametoken, Overloads = new List <FunctionOverload>() }; ret.Overloads.Add(overload); return(ret); }
internal static ParsedSumType 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 ParsedSumType { Name = sumtypename, Type = sumtype }); }
// // Helper routine for parsing a structure definition. // // Consumes tokens and returns a wrapped Structure on success. // Returns null on parsing failures, either due to syntactical // mistakes, or due to legitimate code that isn't a structure. // internal static ParsedObject <Structure> Parse(ParseSession parser) { int totaltokens = 0; if (!parser.CheckToken(0, "structure")) { return(null); } var nametoken = parser.PeekToken(1); if (nametoken == null) { return(null); } if (parser.CheckToken(2, "<")) { if (!parser.ParseTemplateParameters(3, nametoken, out totaltokens)) { return(null); } } else { totaltokens = 2; } if (!parser.CheckToken(totaltokens, ":")) { return(null); } ++totaltokens; var structure = new Structure { Name = nametoken }; structure.Members = new List <Member>(); var parsed = new ParsedObject <Structure> { Name = nametoken, Object = structure }; bool moremembers = true; while (moremembers) { if (parser.CheckToken(totaltokens, "(")) { ++totaltokens; var membername = parser.PeekToken(totaltokens); ++totaltokens; if (!parser.CheckToken(totaltokens, ":")) { return(null); } ++totaltokens; bool moreparams = true; while (moreparams) { ++totaltokens; if (!parser.CheckToken(totaltokens, ",")) { moreparams = false; } else { ++totaltokens; } } if (parser.CheckToken(totaltokens, "->")) { totaltokens += 2; } if (!parser.CheckToken(totaltokens, ")")) { return(null); } ++totaltokens; // TODO - register function-typed structure members } else { int typestarttoken = totaltokens; var membertype = parser.PeekToken(totaltokens); ++totaltokens; int typeendtoken = totaltokens; var membername = parser.PeekToken(totaltokens); ++totaltokens; if (membername.Text.Equals("<")) { int starttotal = totaltokens; if (!parser.ParseTemplateArguments(totaltokens, membertype, out totaltokens)) { return(null); } if (totaltokens <= starttotal) { return(null); } typeendtoken = totaltokens; membername = parser.PeekToken(totaltokens); ++totaltokens; } if (membername.Text.Equals("ref")) { typeendtoken = totaltokens; membername = parser.PeekToken(totaltokens); ++totaltokens; } parsed.Object.Members.Add(new Member { Name = membername, Type = TypeSignatureInstantiated.Construct(parser, typestarttoken, typeendtoken) }); } if (!parser.CheckToken(totaltokens, ",")) { moremembers = false; } else { ++totaltokens; } } parser.ConsumeTokens(totaltokens); return(parsed); }