public override Maybe<Result> VisitTerm_expr(QueryParser.Term_exprContext context) { if (context.string_const() != null) return new ResultSingle(new ValueString(context.string_const().GetText().Trim('\"'))).Just() .FMap(Result.Id); if (context.bool_const() != null) return new ResultSingle(new ValueBoolean(context.bool_const().TRUE() != null)).Just() .FMap(Result.Id); if (context.int_const() != null) return new ResultSingle(new ValueInt(int.Parse(context.int_const().GetText()))).Just() .FMap(Result.Id); if (context.double_const() != null) return new ResultSingle(new ValueDouble(double.Parse(context.double_const().GetText(), CultureInfo.InvariantCulture))).Just().FMap(Result.Id); if (context.LBRACE() != null) //return new ResultSingle(new ValueSet()); throw new NotImplementedException("term_expr: {}"); if (context.LBRACK() != null) throw new NotImplementedException("term_expr: []"); if (context.LT() != null) throw new NotImplementedException("term_expr: <...>"); if (context.cond_expr() != null) return new CondExprVisitor(_zmi, _env).Visit(context.cond_expr()); if (context.statement() != null) return VisitStmt(context.statement()).FMap(Result.Id); var id = context.identifier().ID().GetText(); if (context.LPAREN() != null) return VisitFunction(id, context); var cell = _env.GetIdent(id, out var hasColumn); return !hasColumn ? Maybe<Result>.Nothing : cell.Just(); }
private Maybe<Result> VisitFunction(string id, QueryParser.Term_exprContext context) { List<Result> arguments; if (context.MUL() != null) arguments = _env.ToList(); else { var searchedFor = context.expr_list()?.cond_expr() .Select(c => new CondExprVisitor(_zmi, _env).Visit(c)) .Sequence(); if (searchedFor == null) arguments = new List<Result>(); else if (searchedFor.HasNothing) return Maybe<Result>.Nothing; else arguments = searchedFor.Val; } return Functions.Instance.Evaluate(id, arguments); }
/// <summary> /// Visit a parse tree produced by <see cref="QueryParser.term_expr"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitTerm_expr([NotNull] QueryParser.Term_exprContext context) { return(VisitChildren(context)); }