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(); }