void AnalyzeBinding(Module module, Parse.Syntax.Binding bindingNode, Binding binding, CancellationToken cancel)
        {
            if (bindingNode.Body == null || !bindingNode.Body.Any())
            {
                Unit.AddError(new AnalyzerError
                {
                    ErrorNode = bindingNode,
                    Message   = string.Format(ErrorMessages.E_0014_Analyzer_EmptyBinding, bindingNode.Name.Text),
                });
                return;
            }

            var        triviaNodes = new List <Parse.Syntax.Node>();
            Expression expression  = null;

            Parse.Syntax.Literal literalNode;
            Parse.Syntax.Literal <BigInteger> bigIntLiteral;

            foreach (var node in bindingNode.Body)
            {
                if (cancel.IsCancellationRequested)
                {
                    throw new OperationCanceledException(cancel);
                }

                if ((literalNode = node as Parse.Syntax.Literal) != null)
                {
                    if ((bigIntLiteral = literalNode as Parse.Syntax.Literal <BigInteger>) != null)
                    {
                        expression = new Expressions.IntegerLiteral(bigIntLiteral.Value)
                        {
                            SyntaxNode = bigIntLiteral
                        };
                    }
                    else
                    {
                        throw new NotImplementedException(string.Format("Literals of type {0} not implemented yet.", literalNode.ValueType.Name));
                    }
                }
                else if (node is Parse.Syntax.Space)
                {
                    triviaNodes.Add(node);
                }
            }

            if (expression == null)
            {
                Unit.AddError(new AnalyzerError
                {
                    ErrorNode = bindingNode,
                    Message   = string.Format(ErrorMessages.E_0014_Analyzer_EmptyBinding, bindingNode.Name.Text),
                });
                return;
            }

            foreach (var tn in triviaNodes)
            {
                expression.PostTrivia.Add(tn);
            }

            binding.Expression = expression;
        }
        Task <Module> AnalyzeModule(Parse.Syntax.Module moduleNode, Module module, CancellationToken cancel)
        {
            var bindings = new List <Tuple <Parse.Syntax.Binding, Binding> >();

            // collect module bindings
            var triviaNodes = new List <Parse.Syntax.Node>();

            Binding curBinding = null;

            Parse.Syntax.Binding bindingNode = null;

            foreach (var node in moduleNode.Body)
            {
                if (cancel.IsCancellationRequested)
                {
                    throw new OperationCanceledException(cancel);
                }

                if ((bindingNode = node as Parse.Syntax.Binding) != null)
                {
                    var bindingName = new QualifiedName(module, bindingNode.Name.Text);

                    lock (module.Bindings)
                    {
                        if (module.Bindings.TryGetValue(bindingName, out curBinding))
                        {
                            Unit.AddError(new AnalyzerError
                            {
                                ErrorNode = node,
                                Message   = string.Format(ErrorMessages.E_0012_Analyzer_DuplicateBinding, bindingName.Name),
                            });
                        }
                        else
                        {
                            curBinding = new Binding {
                                Parent = module, Name = bindingName, SyntaxNode = bindingNode
                            };
                            bindings.Add(Tuple.Create(bindingNode, curBinding));
                            module.Bindings.Add(curBinding.Name, curBinding);
                        }

                        foreach (var tn in triviaNodes)
                        {
                            curBinding.PreTrivia.Add(tn);
                        }
                        triviaNodes.Clear();
                    }
                }
                else if (node is Parse.Syntax.Space)
                {
                    triviaNodes.Add(node);
                }
                else
                {
                    Unit.AddError(new AnalyzerError
                    {
                        ErrorNode = node,
                        Message   = string.Format(ErrorMessages.E_0013_Analyzer_InvalidScopeItem, ApteridError.Truncate(node.Text)),
                    });
                }
            }

            if (curBinding != null)
            {
                foreach (var tn in triviaNodes)
                {
                    curBinding.PostTrivia.Add(tn);
                }
            }

            // analyze
            var tasks = bindings.Select(bb => Task.Factory.StartNew(() => AnalyzeBinding(module, bb.Item1, bb.Item2, cancel), TaskCreationOptions.AttachedToParent));

            return(Task.WhenAll(tasks).ContinueWith(t => module));
        }