public override void Visit(RootScriptNode node)
 {
     if (!_startAtOccured)
     {
         ReportStartAtRequired();
     }
 }
Exemple #2
0
        /// <summary>
        ///     Performs "RootScript" specific operations.
        /// </summary>
        /// <param name="node">The "RootScript" node.</param>
        public virtual void Visit(RootScriptNode node)
        {
            Instructions.Add(new Modify(_generateNext));
            Instructions.Add(new BreakInstruction());

            _startAt = new DateTimeOffset(_startAt.Year, _startAt.Month, _startAt.Day, _startAt.Hour, _startAt.Minute, _startAt.Second, TimeZoneInfo.Utc.BaseUtcOffset);
        }
Exemple #3
0
 /// <summary>
 ///     Visit RootScript node in BFS manner.
 /// </summary>
 /// <param name="node">RootScript node that will be visited.</param>
 public void Visit(RootScriptNode node)
 {
     node.Accept(Visitor);
     foreach (var item in node.Descendants)
     {
         item.Accept(this);
     }
 }
Exemple #4
0
        public void Enumerator_EnumerateKeywords_ShouldPass()
        {
            //"case when 1 then 2 when 3 then 4 else 0"
            var rootComponent = new RootScriptNode(new RdlSyntaxNode[]
            {
                new CaseNode(
                    new Token("case", StatementType.Case, new TextSpan(0, 0)),
                    new[]
                {
                    new WhenThenNode(
                        new WhenNode(new Token("when", StatementType.Numeric, new TextSpan()),
                                     new NumericNode(new Token("1", StatementType.Numeric, new TextSpan()), typeof(short))),
                        new ThenNode(new Token("then", StatementType.Numeric, new TextSpan()),
                                     new NumericNode(new Token("2", StatementType.Numeric, new TextSpan()), typeof(short)))
                        ),
                    new WhenThenNode(
                        new WhenNode(new Token("when", StatementType.Numeric, new TextSpan()),
                                     new NumericNode(new Token("3", StatementType.Numeric, new TextSpan()), typeof(short))),
                        new ThenNode(new Token("then", StatementType.Numeric, new TextSpan()),
                                     new NumericNode(new Token("4", StatementType.Numeric, new TextSpan()), typeof(short)))
                        )
                },
                    new ElseNode(new Token("else", StatementType.Else, new TextSpan()),
                                 new NumericNode(new Token("0", StatementType.Numeric, new TextSpan()), typeof(short))))
            });

            var enumerator = new KeywordEnumerator(rootComponent);

            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is RootScriptNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is CaseNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is WhenThenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is WhenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is ThenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is WhenThenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is WhenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is ThenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is ElseNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode);
            Assert.IsFalse(enumerator.MoveNext());
        }
Exemple #5
0
        /// <summary>
        ///     Visit RootScript node in DFS manner.
        /// </summary>
        /// <param name="node">RootScript node that will be visited.</param>
        public void Visit(RootScriptNode node)
        {
            foreach (var item in node.Descendants)
            {
                item.Accept(this);
            }
            node.Accept(_visitor);

            _occurenceTable.Clear();
        }
Exemple #6
0
        /// <summary>
        ///     Convert Abstract Syntax Tree to Virtual Machine object with associated virtual code for such machine
        /// </summary>
        /// <param name="ast">Abstract Syntax Tree.</param>
        /// <param name="request">Request used by user to perform convertion.</param>
        /// <returns>Object that allows evaluate next occurences</returns>
        private ConvertionResponse <IFireTimeEvaluator> Convert(RootScriptNode ast,
                                                                ConvertionRequest <TMethodsAggregator> request)
        {
            var coretnessChecker        = new RdlQueryValidator(Metdatas);
            var queryValidatorTraverser = new Traverser(coretnessChecker);

            ast.Accept(queryValidatorTraverser);

            if (!coretnessChecker.IsValid)
            {
                return(new ConvertionResponse <IFireTimeEvaluator>(null, coretnessChecker.Errors.ToArray()));
            }

            var contextChangeTracker = new Stack <bool>();
            var scopeGenerator       = new ContextGenerator(contextChangeTracker);
            var scopeTraverser       = new ContextGeneratorTraverser(scopeGenerator, contextChangeTracker);

            ast.Accept(scopeTraverser);

            var codeGenerator = request.Debuggable
                ? new DebuggerSymbolGenerator(Metdatas, request.MethodsAggregator, MethodOccurences)
                : new CodeGenerator(Metdatas, request.MethodsAggregator, MethodOccurences);

            var codeGenerationTraverseVisitor = new ExtendedTraverser(codeGenerator, scopeGenerator.Scope.GetRootOfAllScopes());

            ast.Accept(codeGenerationTraverseVisitor);
            IFireTimeEvaluator evaluator = codeGenerator.CreateVirtualMachine(request.CancellationToken);

            if (evaluator == null)
            {
                return(new ConvertionResponse <IFireTimeEvaluator>(null, coretnessChecker.Errors.ToArray()));
            }

            evaluator = new TimeZoneAdjuster(request.Source, evaluator);
            evaluator = new DaylightSavingTimeTracker(request.Source, evaluator);

            return(request.Source == request.Target
                ? new ConvertionResponse <IFireTimeEvaluator>(evaluator)
                : new ConvertionResponse <IFireTimeEvaluator>(new TimeZoneChangerDecorator(request.Source, request.Target, evaluator)));
        }
Exemple #7
0
        public void Enumerator_EnumerateArythmetics_ShouldPass()
        {
            //"7 * ( 8 + 1 ) - 4"
            var rootComponent = new RootScriptNode(
                new RdlSyntaxNode[]
            {
                new HyphenNode(
                    new StarNode(
                        new NumericNode(
                            new Token("7", StatementType.Numeric, new TextSpan()), typeof(short)),
                        new AddNode(
                            new NumericNode(new Token("8", StatementType.Numeric, new TextSpan()), typeof(short)),
                            new NumericNode(new Token("1", StatementType.Numeric, new TextSpan()), typeof(short))
                            )),
                    new NumericNode(new Token("4", StatementType.Numeric, new TextSpan()), typeof(short)))
            });

            var enumerator = new ArythmeticEnumerator(rootComponent);

            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode && ((NumericNode)enumerator.Current).Value == 7);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode && ((NumericNode)enumerator.Current).Value == 8);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode && ((NumericNode)enumerator.Current).Value == 1);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is AddNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is StarNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is NumericNode && ((NumericNode)enumerator.Current).Value == 4);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is HyphenNode);
            enumerator.MoveNext();
            Assert.IsTrue(enumerator.Current is RootScriptNode);
            Assert.IsFalse(enumerator.MoveNext());
        }
Exemple #8
0
 public override void Visit(RootScriptNode node) => ProduceDebuggerInstructions(node, n => base.Visit(n));
Exemple #9
0
 /// <summary>
 ///     Visit RootScript node.
 /// </summary>
 /// <param name="node">RootScript node of AST</param>
 public abstract void Visit(RootScriptNode node);
Exemple #10
0
 public void Visit(RootScriptNode node)
 {
 }
Exemple #11
0
 public ParseResult(RootScriptNode root, IDictionary <int, int> functionCallOccurences)
 {
     Root = root;
     FunctionCallOccurences = functionCallOccurences;
 }