public ExprParser() { this.Tokenizer = new Tokenizer(); _prefixHandlers = new Dictionary <TokenKind, Func <ParsingContext, int, Expr> >() { { TokenKind.Number, (ctx, bp) => double.Parse(ctx.CurrentToken.Content) }, { TokenKind.Symbol, (ctx, bp) => KnownNames.Symbol(ctx.CurrentToken.Content) }, { TokenKind.String, (ctx, bp) => R.Regex.Replace(ctx.CurrentToken.Content.Substring(1, ctx.CurrentToken.Content.Length - 2), @"\\(.)", "$1") }, { TokenKind.OpenGroup, (ctx, bp) => { var inner = this.ParseInternal(ctx); ctx.ExpectToken(TokenKind.CloseGroup); return(inner); } }, { TokenKind.OpChar, (ctx, bp) => { var opToken = ctx.CurrentToken; var arg = this.ParseInternal(ctx, bp); return(opToken.TokenInfo.UnaryHandler(arg)); } }, }; _infixHandlers = new Dictionary <TokenKind, Func <ParsingContext, int, Expr, Expr> >() { { TokenKind.OpenBracket, (ctx, bp, left) => { var args = new List <Expr>(); if (ctx.Peek().Kind != TokenKind.CloseBracket) { args.Add(this.ParseInternal(ctx)); while (ctx.Peek().Kind == TokenKind.Comma) { ctx.Advance(); args.Add(this.ParseInternal(ctx)); } } ctx.ExpectToken(TokenKind.CloseBracket); return(new Apply(left, args.ToArray())); } }, { TokenKind.OpChar, (ctx, bp, left) => { var opToken = ctx.CurrentToken; var right = this.ParseInternal(ctx, bp); return(opToken.TokenInfo.BinaryHandler(left, right)); } }, }; }
public static Expr Apply(this string head, params Expr[] args) { return(new Apply(KnownNames.Symbol(head), args)); }