Node Expression() { // Expr := Term {('+' | '-') Term} Node result = Term(); TokenType token = scanner.Token; if (token == TokenType.TokenPlus || token == TokenType.TokenMinus) { SumNode node = new SumNode(result); do { scanner.Accept(); Node child = Term(); if (token == TokenType.TokenMinus) { child = new MultiNode(new NumberNode(new Number(-1)), child); } node.Children.Add(child); token = scanner.Token; } while (token == TokenType.TokenPlus || token == TokenType.TokenMinus); result = node; } return(result); }
public override SimplifyResult Replace(out Node node) { if (Children.Count == 1) { node = Children[0]; return(new SimplifyResult(true)); } else if (Children.Count == 0) { node = new NumberNode(Number.One); return(new SimplifyResult(true)); } foreach (Node n in Children) { if (typeof(NumberNode).IsInstanceOfType(n) && ((NumberNode)n).Value.N == 0) { node = n; // zero return(new SimplifyResult(true, true)); } else if (typeof(SumNode).IsInstanceOfType(n)) { List <Node> l = new List <Node>(); foreach (Node child in ((SumNode)n).Children) { List <Node> ll = new List <Node>(Children); for (int i = 0; i < ll.Count; i++) { if (ll[i] == n) { ll.RemoveAt(i); break; } } ll.Add(child); l.Add(new MultiNode(ll)); } node = new SumNode(l); return(new SimplifyResult(true, true)); } } node = null; return(new SimplifyResult(false)); }