public Identifier(GeneralLanguageDef languageDef) : base( inp => { var res = Tok.Lexeme( from name in new Ident(languageDef) where !IdentHelper.IsReservedName(name, languageDef) select new IdentifierToken(name, inp.First().Location) ) .Parse(inp); if (res.IsFaulted) { return(res); } if (res.Value.IsEmpty) { return(ParserResult.Fail <IdentifierToken>("unexpected: reserved word", inp)); } return(res); } ) { }
public Operator(GeneralLanguageDef languageDef) : base( inp => { var res = Tok.Lexeme( from name in new Oper(languageDef) where !OpsHelper.IsReservedOp(name, languageDef) select new OperatorToken(name, inp.First().Location)) .Parse(inp); if (res.IsFaulted) { return(res); } if (res.Value.IsEmpty) { return(ParserResult.Fail <OperatorToken>("unexpected: reserved operator", inp)); } return(res); } ) { }
public Ident(GeneralLanguageDef languageDef) : base( inp => (from c in languageDef.IdentStart from cs in Prim.Many(languageDef.IdentLetter) select c.Cons(cs)) .Fail("identifier") .Parse(inp) ) { }
public Oper(GeneralLanguageDef languageDef) : base( inp => (from c in languageDef.OpStart from cs in Prim.Many(languageDef.OpLetter) select c.Cons(cs)) .Fail("operator") .Parse(inp) ) { }
public Reserved(string name, GeneralLanguageDef languageDef) : base( inp => Tok.Lexeme( from cs in IdentHelper.CaseString(name, languageDef) from nf in Prim.NotFollowedBy(languageDef.IdentLetter) .Fail("end of " + cs.AsString()) select new ReservedToken(cs, inp.Head().Location) ) .Parse(inp) ) { }
public ReservedOp(string name, GeneralLanguageDef languageDef) : base( inp => Tok.Lexeme( from op in Prim.String(name) from nf in Prim.NotFollowedBy(languageDef.OpLetter) .Fail("end of " + op.AsString()) select new ReservedOpToken(op, inp.First().Location) ) .Parse(inp) ) { }
/// <summary> /// TODO: Make this pay attention to the case-sensitivity settings /// </summary> internal static bool IsReservedName(ImmutableList <ParserChar> name, GeneralLanguageDef languageDef) { return(languageDef.ReservedNames.Contains(name.AsString())); }
/// <summary> /// TODO: Make this pay attention to the case-sensitivity settings /// </summary> internal static Parser <ImmutableList <ParserChar> > CaseString(string str, GeneralLanguageDef languageDef) { return(Prim.String(str)); }