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);
}