private static void EnsureSyntaxTree(MyAbstractSyntaxTree tree)
        {
            if (tree == null)
            {
                throw new ArgumentNullException(nameof(tree));
            }

            void throwException() => throw new CompilerException();

            if (tree.RootNode == null)
            {
                throwException();
            }

            if (tree.RootNode.Parent != null)
            {
                throwException();
            }

            if (tree.RootNode.Childs == null)
            {
                throwException();
            }

            if (tree.RootNode.Value != null)
            {
                throwException();
            }

            if (tree.RootNode.Childs.Count != 1)
            {
                throwException();
            }

            // Primeiro elemento é um [SumOperatorTreeNode]
            if (tree.RootNode.Childs[0].GetType() != typeof(SumOperatorTreeNode))
            {
                throwException();
            }

            // Primeiro elemento tem mais dois filhos
            if (tree.RootNode.Childs[0].Childs == null || tree.RootNode.Childs[0].Childs.Count != 2)
            {
                throwException();
            }

            // Os elementos filhos são um [UIntegerTreeNode]
            if (tree.RootNode.Childs[0].Childs[0].GetType() != typeof(UIntegerTreeNode) ||
                tree.RootNode.Childs[0].Childs[1].GetType() != typeof(UIntegerTreeNode))
            {
                throwException();
            }

            // Os elementos filhos não tem mais filhos
            if ((tree.RootNode.Childs[0].Childs[0].Childs != null && tree.RootNode.Childs[0].Childs[0].Childs.Count > 0) ||
                (tree.RootNode.Childs[0].Childs[1].Childs != null && tree.RootNode.Childs[0].Childs[1].Childs.Count > 0))
            {
                throwException();
            }
        }
        public static CalcTwoNumbersObject Emitter(MyAbstractSyntaxTree tree)
        {
            EnsureSyntaxTree(tree);

            // Após garantir a estrutura de nossa árvore sintática abstrata,
            // o que temos que fazer aqui é simples.

            // [árvore sintática]
            //        exp
            //         |
            //        sum
            //        /|\
            //       / | \
            //      N1 + N2

            var expNode = tree.RootNode;
            var sumNode = expNode.Childs[0];
            var n1Node  = sumNode.Childs[0] as UIntegerTreeNode;
            var n2Node  = sumNode.Childs[1] as UIntegerTreeNode;

            return(new CalcTwoNumbersObject(n1Node.Value, n2Node.Value));
        }
 public static JavaScriptHalfObject Emitter(MyAbstractSyntaxTree tree)
 {
     throw new NotImplementedException();
 }