public override SyntaxTreeNode Make(ObjectStream <MyToken> input, MyDiscardDelegate <MyToken> discarder) { Ensure(input, discarder); // Ignora código descartável inicialmente input.Discard(discarder); if (input.EndOfStream()) { return(null); } var initialPos = input.GetPosition(); // O primeiro token é só um marcador (etiqueta) pra indicar // um elemento válido var tag = input.Next(); if (tag == null || (CalcTwoNumbersTokenClass)tag.Class != (CalcTwoNumbersTokenClass)GetTokenClass()) { input.SetPosition(initialPos); return(null); } var numberLeftNode = ExpressionElements[0].Make(input, discarder); var plusNode = ExpressionElements[1].Make(input, discarder); var numberRightNode = ExpressionElements[2].Make(input, discarder); if (numberLeftNode == null || plusNode == null || numberRightNode == null) { input.SetPosition(initialPos); return(null); } var exprTreeNode = new SyntaxTreeNode(); plusNode.AddChildNode(numberLeftNode); plusNode.AddChildNode(numberRightNode); exprTreeNode.AddChildNode(plusNode); return(exprTreeNode); }