Axiom.Compiler.Framework.PrologCodeParser.Right C# (CSharp) Метод

Right() приватный Метод

private Right ( int n, int m, BinaryTree &result ) : BinaryTree
n int
m int
result BinaryTree
Результат BinaryTree
        private BinaryTree Right(int n, int m, ref BinaryTree result)
        {
            switch (_scanner.Lookahead.Kind)
            {
                case PrologToken.DOT:
                case PrologToken.RPAREN:
                case PrologToken.RBRACKET:
                    return result;
                case PrologToken.LPAREN:
                case PrologToken.LBRACKET:
                    _errors.Add(new PrologCompilerError("P0007", "Unexpected open brackets or parenthsis", "", false, _scanner.Current.Line, _scanner.Current.Column));
                    return result;
                case PrologToken.COMMA:
                    if (n >= 1000 && m <= 1000)
                    {
                        m = 1000;
                        _scanner.Next();
                        result = new BinaryTree(",", result, Term(m));
                        if (n > m)
                        {
                            Right(n, m, ref result);
                        }
                    }
                    return result;
                case PrologToken.ATOM:
                    PrologOperator laOp = _operators.GetOperator(_scanner.Lookahead.StringValue);
                    if (laOp != null)
                    {
                        if (laOp.IsPostfix &&
                            n >= laOp.PostfixPrecedence &&
                            m <= laOp.PostfixLeftPrecedence)
                        {
                            _scanner.Next();
                            if (_operators.IsOperator(_scanner.Current.StringValue))
                            {
                                PrologOperator o = _operators.GetOperator(_scanner.Current.StringValue);
                                if (o.IsInfix &&
                                   n >= o.InfixPrecedence &&
                                   m <= o.InfixLeftPrecedence)
                                {
                                    switch (_scanner.Lookahead.Kind)
                                    {
                                        case PrologToken.LPAREN:
                                        case PrologToken.LBRACKET:
                                            result = new BinaryTree(o.Name, result, Term(o.InfixRightPrecedence));
                                            m = o.InfixPrecedence;
                                            Right(n, m, ref result);
                                            break;
                                        case PrologToken.COMMA:
                                        case PrologToken.RPAREN:
                                        case PrologToken.RBRACKET:
                                            result = new BinaryTree(_scanner.Current.StringValue, result);
                                            m = o.InfixPrecedence;
                                            Right(n, m, ref result);
                                            break;
                                        case PrologToken.ATOM:
                                            if (_operators.IsOperator(_scanner.Lookahead.StringValue))
                                            {
                                                if (_operators.ExclusivelyPrefix(_scanner.Lookahead.StringValue))
                                                {
                                                    result = new BinaryTree(_scanner.Lookahead.StringValue, result, Term(_operators.GetOperator(_scanner.Lookahead.StringValue).PrefixRightPrecedence));
                                                    m = o.InfixPrecedence;
                                                    Right(n, m, ref result);
                                                    break;
                                                }
                                            }
                                            else
                                            {
                                                result = new BinaryTree(_scanner.Lookahead.StringValue, result, null);
                                                m = _operators.GetOperator(_scanner.Lookahead.StringValue).InfixPrecedence;
                                                Right(n, m, ref result);
                                                break;
                                            }
                                            break;
                                    }
                                }
                                else
                                {
                                    result = new BinaryTree(_scanner.Current.StringValue, result);
                                    m = _operators.GetOperator(_scanner.Current.StringValue).InfixPrecedence;
                                    Right(n, m, ref result);
                                }
                            }
                            break;
                        }
                        else if (laOp.IsInfix && n >= laOp.InfixPrecedence && m <= laOp.InfixLeftPrecedence)
                        {
                            _scanner.Next();
                            int p = _operators.GetOperator(_scanner.Current.StringValue).InfixPrecedence;
                            int t = _operators.GetOperator(_scanner.Current.StringValue).InfixRightPrecedence;
                            result = new BinaryTree(_scanner.Current.StringValue, result, Term(t));
                            m = p;
                            Right(n, m, ref result);
                            break;
                        }
                    }
                    else
                    {
                        return result;
                    }
                    break;
            }
            return result;
        }