private void AddOperationToTree(CodeElement leftExprCode, CodeElement rightOpCode, CodeElement rightExprCode, List <TextElement> comments) { WordBinaryOperator leftOperator = leftExprCode.ParserElement as WordBinaryOperator; WordBinaryOperator rightOpSymbol = rightOpCode.ParserElement as WordBinaryOperator; // is the insertpoint a value // Or the insertPoint is a completed expression (eg parentheses) if (leftOperator == null || (_binaryOperators.Contains(leftOperator) && _completeOperations.Contains(leftExprCode))) { // insert TextElement parent = leftExprCode.Parent; rightOpCode.Add(leftExprCode); rightOpCode.Add(rightExprCode); parent.ReplaceSubElement(leftExprCode, rightOpCode); rightOpCode.AddRange(comments); return; } // if the insertPoint has higther precedence if (leftOperator.Precedence > rightOpSymbol.Precedence) { // insert TextElement parent = leftExprCode.Parent; rightOpCode.Add(leftExprCode); rightOpCode.Add(rightExprCode); parent.ReplaceSubElement(leftExprCode, rightOpCode); rightOpCode.AddRange(comments); return; } // if the insertPoint has lower precedence if (leftOperator.Precedence < rightOpSymbol.Precedence) { AddOperationToTree(leftExprCode.ChildNodes[1] as CodeElement, rightOpCode, rightExprCode, comments); } // if the insertPoint has same precedence and operator is rigth associative else if (rightOpSymbol.RightAssociative) { AddOperationToTree(leftExprCode.ChildNodes[1] as CodeElement, rightOpCode, rightExprCode, comments); } // if the insertPoint has same precedence and operator is left associative else { // insert TextElement parent = leftExprCode.Parent; rightOpCode.Add(leftExprCode); rightOpCode.Add(rightExprCode); parent.ReplaceSubElement(leftExprCode, rightOpCode); rightOpCode.AddRange(comments); return; } }
private void AddAlternatives(Rule ExprRule, ParserElementBase alternative) { // is it more alternatives? var or = alternative as Or; if (or != null) { AddAlternatives(ExprRule, or.ChildNodes[0]); AddAlternatives(ExprRule, or.ChildNodes[1]); return; } // is it a binary operator? (depends opun how Or is implemented) WordSymbol symbol = null; Rule rule = null; if (IsBinaryAlternative(ExprRule, alternative, out symbol, out rule)) { var wordOp = new WordBinaryOperator(symbol, rule != null ? rule.Name : symbol.Value, TextBuffer); _binaryOperators.Add(wordOp); if (rule != null) { rule.ReplaceSubElement(symbol, wordOp); } else { Add(wordOp); } } // Other forms else { _otherForms.Add(alternative); } }