public Func <DateTime, DateTime> ParseRuleObservedString(string source, string dayName, string country, Calendar calendar)
        {
            ICharStream stream = CharStreams.fromstring(source);

            var lexer   = new CalendariumLexer(stream, Output, OutputError);
            var token   = new CommonTokenStream(lexer);
            var _parser = new CalendariumParser(token)
            {
                BuildParseTree = true,
                //Trace = ScriptParser.Trace, // Ca plante sur un null, pourquoi ?
            };

            CalendariumParser.ScriptContext _context = _parser.script();

            var visitor = new ParserBaseVisitor(calendar);

            var call = (Expression <Func <DateTime, DateTime> >)visitor.Visit(_context);

            var txt = "'" + source + "' -> '" + call.Body.ToString() + "'";

            Trace.WriteLine($"{country.ToString()}:{dayName} : {txt}");

            if (System.Diagnostics.Debugger.IsAttached) // Build an interceptor for log
            {
                var parameter = Expression.Parameter(typeof(DateTime), "date");
                var ee        = Expression.Call(null, _delegateLogDebugObserved.Method, call, parameter, Expression.Constant(country), Expression.Constant(dayName), Expression.Constant(txt));
                call = Expression.Lambda <Func <DateTime, DateTime> >(ee, parameter);
            }
            Func <DateTime, DateTime> f = call.Compile();


            return(f);
        }
        /// <summary>
        ///   expression
        /// | INTEROGATION expression_bool COLON expression
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Expression VisitScript([NotNull] CalendariumParser.ScriptContext context)
        {
            Expression result;

            if (context.INTEROGATION() != null)
            {
                _stack.Push(_date);
                var call      = (MethodCallExpression)base.VisitScript(context);
                var e         = VisitExpression_bool(context.expression_bool());
                var condition = Expression.Condition(e, call, _date);
                result = Expression.Lambda <Func <DateTime, DateTime> >(condition, _date);
            }
            else
            {
                var call = (MethodCallExpression)base.VisitScript(context);
                result = Expression.Lambda <Func <int, DateTime[]> >(call, _year);
            }

            return(result);
        }