Пример #1
0
        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));
                  } },
            };
        }
Пример #2
0
 public static Expr Apply(this string head, params Expr[] args)
 {
     return(new Apply(KnownNames.Symbol(head), args));
 }