public override ExprNode VisitFuncExpr(ExprParser.FuncExprContext context) { var funcName = context.func.Text; var func = typeof(Math) .GetMethods(BindingFlags.Public | BindingFlags.Static) .Where(m => m.ReturnType == typeof(double)) .Where(m => m.GetParameters().Select(p => p.ParameterType).SequenceEqual(new[] { typeof(double) })) .FirstOrDefault(m => m.Name.Equals(funcName, StringComparison.OrdinalIgnoreCase)); if (func == null) { throw new NotSupportedException($"Function {funcName} is not supported!"); } return(new FuncNode() { Function = (Func <double, double>)func.CreateDelegate(typeof(Func <double, double>)), Argument = Visit(context.expr()), FName = funcName, }); }
public override AstNode VisitFuncExpr(ExprParser.FuncExprContext context) { if (context == null) { throw new ArgumentException("Error at func expr"); } AstNode.FuncNode node = new AstNode.FuncNode(); //{ // FuncName = context.func.Text, // Arguments = Visit(context.args) as AstNode.FuncArgs, //}; node.FuncName = context.func.Text; if (context.args == null) { throw new ArgumentException("No arguments provided!"); } node.Arguments = Visit(context.args) as AstNode.FuncArgs; return(node); }
/// <summary> /// Exit a parse tree produced by the <c>funcExpr</c> /// labeled alternative in <see cref="ExprParser.expr"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitFuncExpr([NotNull] ExprParser.FuncExprContext context) { }
/// <summary> /// Visit a parse tree produced by the <c>funcExpr</c> /// labeled alternative in <see cref="ExprParser.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 VisitFuncExpr([NotNull] ExprParser.FuncExprContext context) { return(VisitChildren(context)); }