Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
            }
        }