8.5 Комплексна вправа до роздiлу 7
} throw new InvalidOperationException();
public void ReadToken( IInput input)
{ try {
AddToken( GetToken( input));
} catch( InvalidOperationException) { throw new ExpressionSyntaxError( ExpressionSyntaxError. ErrorReason. UnexpectedToken, input. Position);
}
}
private bool FindMinPriorityBinOp( out int position, out BinaryOp op)
{ position =-1; op = null; int i = 0; foreach( IToken tok in tokens) { if( tok is BinaryOp &&( op == null ||(( BinaryOp) tok). Priority <= op. Priority))
{ op =( BinaryOp) tok; position = i;
} i ++;
} return( op!= null);
}
public Expression BuildExpressionTree() { if( tokens. Count == 0) return new EmptyExpression(); int pos; BinaryOp op; if( FindMinPriorityBinOp( out pos, out op)) { if( pos == 0) throw new Exception(" Unknown error ");
Expression left = new RawExpression( tokens. Take( pos)).
BuildExpressionTree(); tokens. RemoveRange( 0, pos + 1); Expression right = BuildExpressionTree(); return new BinaryExpression( op, left, right);
} else { IToken tok = tokens. First(); if( tok is UnaryOp) { tokens. RemoveAt( 0);
193